Advertisement
Guest User

Untitled

a guest
Apr 29th, 2016
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. static void Main() {
  2. var excel = new Microsoft.Office.Interop.Excel.Application();
  3. Microsoft.Office.Interop.Excel.WorksheetFunction wsf = excel.WorksheetFunction;
  4. var start = new DateTime(1999, 11, 1);
  5. var end = new DateTime(1999, 1, 11);
  6. for (var basis = 0; basis != 5; basis++) {
  7. Console.WriteLine(wsf.YearFrac(start, end, basis));
  8. }
  9. }
  10.  
  11. public static double Yearfrac(DateTime startDate,DateTime endDate,DayCount daycount=DayCount.ActAct)
  12. {
  13. var nbDaysInPeriod = (double)(endDate - startDate).Days;
  14.  
  15. switch(daycount)
  16. {
  17. case (DayCount.Act360):
  18. return nbDaysInPeriod / (double)360;
  19. case (DayCount.Act365):
  20. return nbDaysInPeriod / (double)365;
  21. case (DayCount.ActAct):
  22. return GetActAct(startDate,endDate);
  23. case (DayCount.Days360):
  24. var result = (endDate.Year - startDate.Year) * 360.0 + (endDate.Month - startDate.Month) * 30.0 + (Math.Min(endDate.Day, 30.0) - Math.Min(startDate.Day, 30.0));
  25. return result/360;
  26. default:
  27. return nbDaysInPeriod / (double)365;
  28. }
  29. }
  30.  
  31. public static double GetActAct(DateTime startDate, DateTime endDate)
  32. {
  33. // Reproduce Excel Yearfrac as per http://www.dwheeler.com/yearfrac/excel-ooxml-yearfrac.pdf
  34. var nbDaysInPeriod = (double)(endDate - startDate).Days;
  35. if(startDate.Year==endDate.Year || (endDate.Year-1==startDate.Year&&(startDate.Month>endDate.Month||startDate.Month==endDate.Month&&(startDate.Day>=endDate.Day))))
  36. {
  37. var den = 365.0;
  38. if (startDate.Year == endDate.Year && DateTime.IsLeapYear(startDate.Year))
  39. {
  40. den++;
  41. }
  42. else
  43. {
  44.  
  45. if (endDate.Day == 29 && endDate.Month == 2)
  46. {
  47. den++;
  48. }
  49. else
  50. {
  51. if (DateTime.IsLeapYear(startDate.Year))
  52. {
  53. var feb = new DateTime(startDate.Year, 2, 29);
  54. if (startDate<=feb && feb<=endDate) den++;
  55. }
  56. else
  57. {
  58. if (DateTime.IsLeapYear(endDate.Year))
  59. {
  60. var feb = new DateTime(endDate.Year, 2, 29);
  61. if (startDate <= feb && feb <= endDate) den++;
  62. }
  63. }
  64. }
  65. }
  66. }
  67. else
  68. {
  69. var nbYears = endDate.Year - startDate.Year+1;
  70. var den = nbYears * 365.0;
  71. for (var i=0;i<nbYears;i++)
  72. {
  73. if (DateTime.IsLeapYear(startDate.Year + i)) den++;
  74. }
  75. den /= nbYears;
  76. return nbDaysInPeriod / den;
  77. }
  78. return nbDaysInPeriod / 365.0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement