2 // System.DateTime.cs
\r
5 // Marcel Narings (marcel@narings.nl)
\r
7 // (C) 2001 Marcel Narings
\r
10 using System.Globalization ;
\r
16 /// The DateTime structure represents dates and time ranging from
\r
17 /// 1-1-0001 12:00:00 AM to 31-12-9999 23:59:00 Common Era.
\r
20 public struct DateTime : IComparable , IFormattable , IConvertible
\r
24 private const long MaxTicks = 3155378975999999999L;
\r
25 private const long MinTicks = 0L;
\r
26 private const int dp400 = 146097;
\r
27 private const int dp100 = 36524;
\r
28 private const int dp4 = 1461;
\r
30 public static readonly DateTime MaxValue = new DateTime (MaxTicks);
\r
31 public static readonly DateTime MinValue = new DateTime (MinTicks);
\r
41 private static int[] daysmonth = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
\r
42 private static int[] daysmonthleap = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
\r
44 private static long AbsoluteDays (int year, int month, int day)
\r
49 days = (IsLeapYear(year) ? daysmonthleap : daysmonth);
\r
53 return ((day-1) + temp + (365* (year-1)) + ((year-1)/4) - ((year-1)/100) + ((year-1)/400));
\r
56 private int FromTicks(Which what)
\r
58 int num400, num100, num4, numyears;
\r
61 int[] days = daysmonth;
\r
62 int totaldays = (int) (ticks / TimeSpan.TicksPerDay);
\r
64 num400 = (totaldays / dp400);
\r
65 totaldays -= num400 * dp400;
\r
67 num100 = (totaldays / dp100);
\r
68 if (num100 == 4) // leap
\r
70 totaldays -= (num100 * dp100);
\r
72 num4 = totaldays / dp4;
\r
73 totaldays -= (num4 * dp4);
\r
75 numyears = totaldays / 365 ;
\r
77 if (numyears == 4) //leap
\r
79 if (what == Which.Year )
\r
80 return num400*400 + num100*100 + num4*4 + numyears + 1;
\r
82 totaldays -= (numyears * 365) ;
\r
83 if (what == Which.DayYear )
\r
84 return totaldays + 1;
\r
86 if ((numyears==3) && ((num100 == 3) || !(num4 == 24)) ) //31 dec leapyear
\r
87 days = daysmonthleap;
\r
89 while (totaldays >= days[M])
\r
90 totaldays -= days[M++];
\r
92 if (what == Which.Month )
\r
95 return totaldays +1;
\r
104 /// Constructs a DateTime for specified ticks
\r
107 public DateTime (long newticks)
\r
111 if ( newticks < MinValue.ticks || newticks > MaxValue.ticks)
\r
112 throw new ArgumentOutOfRangeException ();
\r
115 public DateTime (int year, int month, int day)
\r
116 : this (year, month, day,0,0,0,0) {}
\r
118 public DateTime (int year, int month, int day, int hour, int minute, int second)
\r
119 : this (year, month, day, hour, minute, second, 0) {}
\r
121 public DateTime (int year, int month, int day, int hour, int minute, int second, int millisecond)
\r
123 if ( year < 1 || year > 9999 ||
\r
124 month < 1 || month >12 ||
\r
125 day < 1 || day > DaysInMonth(year, month) ||
\r
126 hour < 0 || hour > 23 ||
\r
127 minute < 0 || minute > 59 ||
\r
128 second < 0 || second > 59 )
\r
129 throw new ArgumentOutOfRangeException() ;
\r
131 ticks = AbsoluteDays(year,month,day) * TimeSpan.TicksPerDay +
\r
132 hour * TimeSpan.TicksPerHour +
\r
133 minute * TimeSpan.TicksPerMinute +
\r
134 second * TimeSpan.TicksPerSecond +
\r
135 millisecond * TimeSpan.TicksPerMillisecond ;
\r
137 if (ticks < MinValue.ticks || ticks > MaxValue.ticks )
\r
138 throw new ArgumentException() ;
\r
141 public DateTime (int year, int month, int day, Calendar calendar)
\r
142 : this (year, month, day, 0, 0, 0, 0, calendar) {}
\r
145 public DateTime (int year, int month, int day, int hour, int minute, int second, Calendar calendar)
\r
146 : this (year, month, day, hour, minute, second, 0, calendar) {}
\r
149 public DateTime (int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar)
\r
150 : this(year, month, day, hour, minute, second, millisecond)
\r
152 if ( calendar == null)
\r
153 throw new ArgumentNullException();
\r
159 public DateTime Date
\r
163 return new DateTime(ticks - (ticks % TimeSpan.TicksPerDay )) ;
\r
171 return FromTicks(Which.Day);
\r
175 public DayOfWeek DayOfWeek
\r
179 return ( (DayOfWeek) (((ticks / TimeSpan.TicksPerDay)+1) % 7) );
\r
183 public int DayOfYear
\r
187 return FromTicks(Which.DayYear);
\r
195 return ( (int) ((ticks % TimeSpan.TicksPerDay) / TimeSpan.TicksPerHour) );
\r
199 public int Millisecond
\r
203 return ( (int) (ticks % TimeSpan.TicksPerSecond / TimeSpan.TicksPerMillisecond) );
\r
211 return ( (int) (ticks % TimeSpan.TicksPerHour / TimeSpan.TicksPerMinute) );
\r
219 return FromTicks(Which.Month);
\r
223 // TODO implement me
\r
224 public static DateTime Now
\r
228 return new DateTime (0);
\r
236 return (int) (ticks % TimeSpan.TicksPerMinute / TimeSpan.TicksPerSecond);
\r
248 public TimeSpan TimeOfDay
\r
252 return new TimeSpan(ticks % TimeSpan.TicksPerDay );
\r
258 public static DateTime Today
\r
262 return new DateTime (0);
\r
267 public static DateTime UtcNow
\r
270 return new DateTime (0);
\r
278 return FromTicks(Which.Year);
\r
284 public DateTime Add (TimeSpan ts)
\r
288 newticks = ticks + ts.Ticks ;
\r
290 if (ts.Ticks < MinTicks || ts.Ticks > MaxTicks ||
\r
291 newticks < MinTicks || newticks > MaxTicks)
\r
292 throw new ArgumentException ();
\r
294 return new DateTime (newticks);
\r
297 public DateTime AddDays (double days)
\r
299 return AddMilliseconds (days * 86400000);
\r
302 public DateTime AddTicks (long t)
\r
304 long newticks = ticks + t;
\r
306 if (t<MinTicks || t>MaxTicks || newticks<MinTicks || newticks>MaxTicks)
\r
307 throw new ArgumentException ();
\r
309 return new DateTime(newticks);
\r
312 public DateTime AddHours (double hours)
\r
314 return AddMilliseconds (hours * 3600000);
\r
317 public DateTime AddMilliseconds (double ms)
\r
319 long msticks, newticks;
\r
321 msticks = (long) (ms += ms > 0 ? 0.5 : -0.5) * TimeSpan.TicksPerMillisecond ;
\r
322 newticks = ticks + msticks ;
\r
324 if (msticks < MinTicks || msticks > MaxTicks ||
\r
325 newticks < MinTicks || newticks > MaxTicks)
\r
326 throw new ArgumentException ();
\r
328 return new DateTime (newticks);
\r
331 public DateTime AddMinutes (double minutes)
\r
333 return AddMilliseconds (minutes * 60000);
\r
336 public DateTime AddMonths (int months)
\r
338 int day, month, year, maxday ;
\r
342 month = this.Month + (months % 12);
\r
343 year = this.Year + months/12 ;
\r
347 month = 12 + month ;
\r
350 else if (month>12)
\r
355 maxday = DaysInMonth(year, month);
\r
359 temp = new DateTime (year, month, day);
\r
360 return temp.Add (this.TimeOfDay);
\r
363 public DateTime AddSeconds (double seconds)
\r
365 return AddMilliseconds (seconds*1000);
\r
368 public DateTime AddYears (int years )
\r
370 return AddMonths(years * 12);
\r
373 public static int Compare (DateTime t1, DateTime t2)
\r
375 if (t1.ticks < t2.ticks)
\r
377 else if (t1.ticks > t2.ticks)
\r
383 public int CompareTo (object v)
\r
388 if (!(v is System.DateTime))
\r
389 throw new ArgumentException (Locale.GetText (
\r
390 "Value is not a System.DateTime"));
\r
392 return Compare (this, (DateTime) v);
\r
395 public static int DaysInMonth (int year, int month)
\r
399 if (month < 1 || month >12)
\r
400 throw new ArgumentOutOfRangeException ();
\r
402 days = (IsLeapYear(year) ? daysmonthleap : daysmonth);
\r
403 return days[month];
\r
406 public override bool Equals (object o)
\r
408 if (!(o is System.DateTime))
\r
411 return ((DateTime) o).ticks == ticks;
\r
414 public static bool Equals (DateTime t1, DateTime t2 )
\r
416 return (t1.ticks == t2.ticks );
\r
419 // TODO: Implement me.
\r
420 public static DateTime FromFileTime (long fileTime)
\r
422 return new DateTime (0);
\r
425 // TODO: Implement me.
\r
426 public static DateTime FromOADate (double d)
\r
428 return new DateTime(0);
\r
431 // TODO: Implement me.
\r
432 public string[] GetDateTimeFormats()
\r
437 //TODO: implement me
\r
438 public string[] GetDateTimeFormats( char format )
\r
443 // TODO: implement me
\r
444 public string[] GetDateTimeFormats( IFormatProvider provider)
\r
449 //TODO: implement me
\r
450 public string[] GetDateTimeFormats(char format,IFormatProvider provider )
\r
455 public override int GetHashCode ()
\r
457 return (int) ticks;
\r
460 public TypeCode GetTypeCode ()
\r
462 return TypeCode.DateTime;
\r
465 public static bool IsLeapYear (int year)
\r
467 return ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ;
\r
470 public static DateTime Parse (string s)
\r
472 // TODO: Implement me
\r
473 return new DateTime (0);
\r
476 public static DateTime Parse (string s, IFormatProvider fp)
\r
478 // TODO: Implement me
\r
479 return new DateTime (0);
\r
482 public static DateTime Parse (string s, NumberStyles style, IFormatProvider fp)
\r
484 // TODO: Implement me
\r
485 return new DateTime (0);
\r
488 public static DateTime ParseExact(string s, string format, IFormatProvider provider )
\r
490 // TODO: Implement me
\r
491 return new DateTime (0);
\r
494 public static DateTime ParseExact(string s, string format, IFormatProvider provider, DateTimeStyles style )
\r
496 // TODO: Implement me
\r
497 return new DateTime (0);
\r
501 public static DateTime ParseExact( string s, string[] formats, IFormatProvider provider, DateTimeStyles style )
\r
503 // TODO: Implement me
\r
504 return new DateTime (0);
\r
508 public TimeSpan Subtract(DateTime dt )
\r
510 return new TimeSpan(ticks - dt.ticks );
\r
513 public DateTime Subtract(TimeSpan ts)
\r
515 return new DateTime(ticks - ts.Ticks );
\r
518 public long ToFileTime()
\r
520 // TODO: Implement me
\r
524 public DateTime ToLocalTime()
\r
526 // TODO Implement me
\r
527 return new DateTime (0);
\r
530 public string ToLongDateString()
\r
532 // TODO implement me
\r
533 throw new NotImplementedException ();
\r
536 public string ToLongTimeString()
\r
538 // TODO implement me
\r
539 throw new NotImplementedException ();
\r
542 public double ToOADate()
\r
544 // TODO implement me
\r
548 public string ToShortDateString()
\r
550 // TODO implement me
\r
551 throw new NotImplementedException ();
\r
554 public string ToShortTimeString()
\r
556 // TODO implement me
\r
557 throw new NotImplementedException ();
\r
560 public override string ToString ()
\r
562 // TODO: Implement me
\r
563 throw new NotImplementedException ();
\r
566 public string ToString (IFormatProvider fp)
\r
568 // TODO: Implement me.
\r
569 throw new NotImplementedException ();
\r
572 public string ToString (string format)
\r
574 // TODO: Implement me.
\r
575 throw new NotImplementedException ();
\r
578 public string ToString (string format, IFormatProvider fp)
\r
580 // TODO: Implement me.
\r
581 throw new NotImplementedException ();
\r
584 public DateTime ToUniversalTime()
\r
586 // TODO: implement me
\r
587 return new DateTime(0);
\r
592 public static DateTime operator +(DateTime d, TimeSpan t)
\r
594 return new DateTime (d.ticks + t.Ticks);
\r
597 public static bool operator ==(DateTime d1, DateTime d2)
\r
599 return (d1.ticks == d2.ticks);
\r
602 public static bool operator >(DateTime t1,DateTime t2)
\r
604 return (t1.ticks > t2.ticks);
\r
607 public static bool operator >=(DateTime t1,DateTime t2)
\r
609 return (t1.ticks >= t2.ticks);
\r
612 public static bool operator !=(DateTime d1, DateTime d2)
\r
614 return (d1.ticks != d2.ticks);
\r
617 public static bool operator <(DateTime t1, DateTime t2)
\r
619 return (t1.ticks < t2.ticks );
\r
622 public static bool operator <=(DateTime t1,DateTime t2)
\r
624 return (t1.ticks <= t2.ticks);
\r
627 public static TimeSpan operator -(DateTime d1,DateTime d2)
\r
629 return new TimeSpan(d1.ticks - d2.ticks);
\r
632 public static DateTime operator -(DateTime d,TimeSpan t )
\r
634 return new DateTime (d.ticks - t.Ticks);
\r
637 public bool ToBoolean(IFormatProvider provider)
\r
639 throw new InvalidCastException();
\r
642 public byte ToByte(IFormatProvider provider)
\r
644 throw new InvalidCastException();
\r
647 public char ToChar(IFormatProvider provider)
\r
649 throw new InvalidCastException();
\r
652 // TODO Implement me
\r
653 public System.DateTime ToDateTime(IFormatProvider provider)
\r
655 return new System.DateTime(this.ticks);
\r
658 public decimal ToDecimal(IFormatProvider provider)
\r
660 throw new InvalidCastException();
\r
663 public double ToDouble(IFormatProvider provider)
\r
665 throw new InvalidCastException();
\r
668 public Int16 ToInt16(IFormatProvider provider)
\r
670 throw new InvalidCastException();
\r
673 public Int32 ToInt32(IFormatProvider provider)
\r
675 throw new InvalidCastException();
\r
678 public Int64 ToInt64(IFormatProvider provider)
\r
680 throw new InvalidCastException();
\r
683 [CLSCompliant(false)]
\r
684 public SByte ToSByte(IFormatProvider provider)
\r
686 throw new InvalidCastException();
\r
689 public Single ToSingle(IFormatProvider provider)
\r
691 throw new InvalidCastException();
\r
694 public object ToType(Type conversionType,IFormatProvider provider)
\r
696 throw new InvalidCastException();
\r
699 UInt16 System.IConvertible.ToUInt16(IFormatProvider provider)
\r
701 throw new InvalidCastException();
\r
704 [CLSCompliant(false)]
\r
705 public UInt32 ToUInt32(IFormatProvider provider)
\r
707 throw new InvalidCastException();
\r
710 [CLSCompliant(false)]
\r
711 public UInt64 ToUInt64(IFormatProvider provider)
\r
713 throw new InvalidCastException();
\r
720 public enum DayOfWeek
\r