【C#】16. IMM (Date class 更新)
2015-03-11 18:30
141 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; namespace UserDefinedDataEXP { public class Date { private DateTime dt; private int _diffYear,_diffMonth,_diffDay; #region 属性Year、Month、Day、SerialValue //0.1 属性Year public int Year { get { return dt.Year; } } //0.2 属性Month public int Month { get { return dt.Month; } } //0.3 属性Day public int Day { get { return dt.Day; } } //0.4 属性SerialValue public int SerialValue { get { return dt.Subtract(new DateTime(1900, 1, 1)).Days + 2; } } //0.5 属性DateValue public DateTime DateValue { get { return dt; } } #endregion #region 改写运算符 //1. Operator + public static Date operator +(Date D1,Date D2) { Date result = new Date(D1.Year+D2.Year,D1.Month+D2.Month,D1.Day+D2.Day); return result; } //2. Operator - public static Date operator -(Date D1, Date D2) { Date result = new Date(D1.Year - D2.Year, D1.Month- D2.Month, D1.Day - D2.Day); return result; } //3. Operator == public static bool operator ==(Date D1, Date D2) { if (D1.Year == D2.Year && D1.Month == D2.Month && D1.Day == D2.Day) { return true; } else { return false; } } //4. Operator != public static bool operator !=(Date D1, Date D2) { if (D1.Year != D2.Year || D1.Month != D2.Month || D1.Day != D2.Day) { return true; } else { return false; } } //5. Operator > public static bool operator >(Date D1, Date D2) { if (D1.SerialValue>D2.SerialValue) { return true; } else { return false; } } //6. Operator > public static bool operator <(Date D1, Date D2) { if (D1.SerialValue < D2.SerialValue) { return true; } else { return false; } } #endregion #region 构造器 //1.1 构造器 public Date() { dt = new DateTime(); } //1.2 构造器 public Date(int Year, int Month, int Day) { dt = new DateTime(Year,Month,Day); } //1.3 构造器 public Date(DateTime date) { dt = new DateTime(date.Year,date.Month,date.Day); } //1.4 构造器 public Date(int ExcelSerialNum) { dt = new DateTime(1900,1,1).AddDays(ExcelSerialNum-2); } //1.5 构造器 public Date(Date dt2) { dt = new DateTime(dt2.dt.Year,dt2.dt.Month,dt2.dt.Day); } #endregion #region YearFactor //3.1 Act/Act public double YF_AA(Date endDate) { return D_MM(endDate) / (DateTime.IsLeapYear(this.Year) ? 366 : 365); } //3.2 Act/360 public double YF_MM(Date endDate) { return (endDate.SerialValue - this.SerialValue) / 360.0; } public double YF_30_360(Date endDate) { return D_30_360(endDate) / 360.0; } public double YF_30_360E(Date endDate) { return D_30_360E(endDate) / 360.0; } public double YF_30_360E_ISDA(Date endDate) { return D_30_360E_ISDA(endDate) / 360.0; } public double YF_30_365(Date endDate) { return D_30_360(endDate) / 365.0; } //3.4 【改】YF_365 = Act/365 public double YF_365(Date endDate) { return D_MM(endDate) / 365.0; } //3.5 【改】YF_365_25 = Act/365.25 public double YF_365_25(Date endDate) { return D_MM(endDate)/ 365.25; } #endregion //// 函数End Of Month //public int EOM(Date date) //{ // int _eom=30; // switch (date.Month) // { // case 2: // if (DateTime.IsLeapYear(date.Year)) _eom = 29; // else _eom = 28; // break; // case 1: // case 3: // case 5: // case 7: // case 8: // case 10: // case 12: // _eom=31; // break; // default: // break; // } // return _eom; //} //4.1 Day Count #region Day Count public int D_MM(Date endDate) { return endDate.SerialValue - this.SerialValue; } public int D_30_360(Date endDate) { _diffYear = endDate.Year - this.Year; _diffMonth = endDate.Month - this.Month; _diffDay = endDate.Day - dt.Day; return 360*_diffYear + 30 * _diffMonth + _diffDay; } public int D_30_360E(Date endDate) { _diffYear = endDate.Year - this.Year; _diffMonth = endDate.Month - this.Month; if (endDate.Day == 31) _diffDay = 30; else _diffDay = endDate.Day; if (this.Day == 31) _diffDay -= 30; else _diffDay -= this.Day; return 360*_diffYear + 30 * _diffMonth + _diffDay; } public int D_30_360E_ISDA(Date endDate) { _diffYear = endDate.Year - this.Year; _diffMonth = endDate.Month - this.Month; if (endDate.Day ==DateTime.DaysInMonth(endDate.Year,endDate.Month)) _diffDay = 30; else _diffDay = endDate.Day; if (this.Day == 31) _diffDay -= 30; else _diffDay -= this.Day; return 360*_diffYear + 30 * _diffMonth + _diffDay; } public double D_EFF(Date Date2) { return Date2.SerialValue - this.SerialValue; } #endregion //5.1 add_workdays() public Date add_workdays(int workdays) { DateTime dt1 = dt; for (int i = 0; i < workdays; i++) { switch (dt.DayOfWeek) { case DayOfWeek.Saturday: dt1 = dt.AddDays(2); break; case DayOfWeek.Friday: dt1 = dt.AddDays(3); break; default: dt1 = dt1.AddDays(1); break; } } return new Date(dt1); } //8. 函数add_period_string public Date add_period_string(string addPeriod, int n) { DateTime dt1 = dt; switch (addPeriod.Substring(1,1)) { case "d": dt1 = dt1.AddDays(double.Parse(addPeriod.Substring(0, 1))); break; case "m": dt1 = dt1.AddMonths(int.Parse(addPeriod.Substring(0,1))); break; case "y": dt1 = dt1.AddYears(int.Parse(addPeriod.Substring(0,1))); break; } if (dt1.DayOfWeek==DayOfWeek.Sunday||dt1.DayOfWeek==DayOfWeek.Saturday) { return new Date(dt1).add_workdays(n); } else { return new Date(dt1); } } //9. 属性FormatedDate public void PrintFormatedDate() { Console.Write(dt.ToString("ddd_dd_MMM_yyyy", DateTimeFormatInfo.InvariantInfo)); } //10. 函数AddMonth public Date AddMonths(int month) { return new Date(dt.AddMonths(month)); } //【更新】2015/3/11 //给出指定年月的第三个周三的日期 public static Date IMMDate(int Month, int Year) { // Start with last day of previous month DateTime outPut = new DateTime(Year, Month, 1).AddDays(-1); int NoOfWednesday = 0; // Wednesday counter // Loop to find third Wednesday while (NoOfWednesday < 3) { outPut = outPut.AddDays(1); if (outPut.DayOfWeek == DayOfWeek.Wednesday) { NoOfWednesday++; } } return new Date(outPut); } public Date IMMDate() { return IMMDate(dt.Month, dt.Year); } //给出距离Today第NthStir近的一个IMM Date public static Date IMM_Date_Nth(Date Today, int NthStir) { DateTime Today_ = Today.DateValue; // Casting to DateTime int Month = Today_.Month; // Month int int Year = Today_.Year; // Year int int Rem; // The remainder int result = Math.DivRem(Month, 3, out Rem); int Quarter = Month + (3 - Rem) * Math.Sign(Rem); if (Today.SerialValue > (IMMDate(Quarter, Year).SerialValue - 2)) { Rem = Quarter + 3 * NthStir; } else { Rem = Quarter + 3 * (NthStir - 1); } return IMMDate(Rem - 12 * (int)((Rem - 0.5) / 12), Year + (int)((Rem - 0.5) / 12)); } public Date IMM_Date_Nth(int NthStir) { return IMM_Date_Nth(this, NthStir); } //打印函数 public override string ToString() { return dt.ToString("ddd_dd_MMM_yyyy", DateTimeFormatInfo.InvariantInfo); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Globalization; namespace UserDefinedDataEXP { class test { static void Main(string[] args) { Example3(); Console.Read(); } public static void Example3() { Date today = new Date(2011, 6, 16); // My today int minIndex = 0; // Min index of myDateVect int nOfDates = 6; // # element of myDateVect Vector<Date> myDateVect = new Vector<Date>(nOfDates, minIndex); string myDateFormat = "ddd dd MMM yyyy"; // Data format for output Console.WriteLine("Reference Date Third Wednesday of Ref Date"); for (int i = minIndex; i < nOfDates; i++) { myDateVect[i] = today.AddMonths(3 * i); Console.WriteLine("{0} \t{1}", myDateVect[i].DateValue.ToString(myDateFormat), myDateVect[i].IMMDate().DateValue.ToString(myDateFormat)); } Console.WriteLine("\n{0} {1}", "IMM Dates for futures strip [Mar,Jun,Sep,Dec]. Today is", today.DateValue.ToString(myDateFormat)); // We show the IMM Date of futures strip of type Mar,Jun,Sep,Dec for (int i = minIndex + 1; i < nOfDates; i++) { Console.WriteLine("#{0} stir \t{1}", i, today.IMM_Date_Nth(i).DateValue.ToString(myDateFormat)); } } } }
相关文章推荐
- [导入]Why does C#'s iterators feature spit out a class definition instead of a struct definition?
- The MD4 Class.(C#)
- 在C#中更新数据库(一)
- [导入]Struct 和Class的区别,在C#中
- Mini C# Set class
- 用C#实现的图象处理(源代码)------正在更新中!
- Calling C++ Unmanaged Class from C#
- 关于 c# 的 Partial Class
- 定向思维 C# datediff
- Online C# Class Generator
- WinForm C#: Simple Runtime Control ReSizing and Dragging & Moving Class
- C#中关于通过dataGrid更新数据库
- C# struct & class Differences
- C#从网络获取时间更新本机时间
- using class in c#(simple)
- [土哥原创]在Redhat Linux中使用apt取代up2date来更新你的系统!
- [ASP.net(C#)]用DataSet进入对数据源的插入數據、更新數據及刪除數據
- 第一次用PROCEDURE 和CLASS 做ASP.NET (C#)
- 简单实用的DataSet更新数据库的类+总结(c#)
- C# MAIL CLASS