2 // System.DateTime.cs
\r
5 // Marcel Narings (marcel@narings.nl)
\r
6 // Martin Baulig (martin@gnome.org)
\r
8 // (C) 2001 Marcel Narings
\r
11 using System.Globalization;
\r
12 using System.Runtime.CompilerServices;
\r
18 /// The DateTime structure represents dates and time ranging from
\r
19 /// 1-1-0001 12:00:00 AM to 31-12-9999 23:59:00 Common Era.
\r
23 public struct DateTime : IComparable , IFormattable , IConvertible
\r
25 private TimeSpan ticks;
\r
27 private const int dp400 = 146097;
\r
28 private const int dp100 = 36524;
\r
29 private const int dp4 = 1461;
\r
31 // w32 file time starts counting from 1/1/1601 00:00 GMT
\r
32 // which is the constant ticks from the .NET epoch
\r
33 private const long w32file_epoch = 504911232000000000L;
\r
36 // The UnixEpoch, it begins on Jan 1, 1970 at 0:0:0, expressed
\r
39 internal const long UnixEpoch = 621355968000000000L;
\r
41 public static readonly DateTime MaxValue = new DateTime (false,TimeSpan.MaxValue);
\r
42 public static readonly DateTime MinValue = new DateTime (false,TimeSpan.MinValue);
\r
52 private static int[] daysmonth = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
\r
53 private static int[] daysmonthleap = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
\r
55 private static int AbsoluteDays (int year, int month, int day)
\r
60 days = (IsLeapYear(year) ? daysmonthleap : daysmonth);
\r
64 return ((day-1) + temp + (365* (year-1)) + ((year-1)/4) - ((year-1)/100) + ((year-1)/400));
\r
67 private int FromTicks(Which what)
\r
69 int num400, num100, num4, numyears;
\r
72 int[] days = daysmonth;
\r
73 int totaldays = this.ticks.Days;
\r
75 num400 = (totaldays / dp400);
\r
76 totaldays -= num400 * dp400;
\r
78 num100 = (totaldays / dp100);
\r
79 if (num100 == 4) // leap
\r
81 totaldays -= (num100 * dp100);
\r
83 num4 = totaldays / dp4;
\r
84 totaldays -= (num4 * dp4);
\r
86 numyears = totaldays / 365 ;
\r
88 if (numyears == 4) //leap
\r
90 if (what == Which.Year )
\r
91 return num400*400 + num100*100 + num4*4 + numyears + 1;
\r
93 totaldays -= (numyears * 365) ;
\r
94 if (what == Which.DayYear )
\r
95 return totaldays + 1;
\r
97 if ((numyears==3) && ((num100 == 3) || !(num4 == 24)) ) //31 dec leapyear
\r
98 days = daysmonthleap;
\r
100 while (totaldays >= days[M])
\r
101 totaldays -= days[M++];
\r
103 if (what == Which.Month )
\r
106 return totaldays +1;
\r
113 /// Constructs a DateTime for specified ticks
\r
116 public DateTime (long newticks)
\r
117 // `local' must default to false here to avoid
\r
118 // a recursion loop.
\r
119 : this (false, newticks) {}
\r
121 internal DateTime (bool local, long newticks)
\r
122 : this (true, new TimeSpan (newticks))
\r
125 TimeZone tz = TimeZone.CurrentTimeZone;
\r
127 TimeSpan utcoffset = tz.GetUtcOffset (this);
\r
129 ticks = ticks + utcoffset;
\r
133 public DateTime (int year, int month, int day)
\r
134 : this (year, month, day,0,0,0,0) {}
\r
136 public DateTime (int year, int month, int day, int hour, int minute, int second)
\r
137 : this (year, month, day, hour, minute, second, 0) {}
\r
139 public DateTime (int year, int month, int day, int hour, int minute, int second, int millisecond)
\r
141 if ( year < 1 || year > 9999 ||
\r
142 month < 1 || month >12 ||
\r
143 day < 1 || day > DaysInMonth(year, month) ||
\r
144 hour < 0 || hour > 23 ||
\r
145 minute < 0 || minute > 59 ||
\r
146 second < 0 || second > 59 )
\r
147 throw new ArgumentOutOfRangeException() ;
\r
149 ticks = new TimeSpan (AbsoluteDays(year,month,day), hour, minute, second, millisecond);
\r
152 public DateTime (int year, int month, int day, Calendar calendar)
\r
153 : this (year, month, day, 0, 0, 0, 0, calendar) {}
\r
156 public DateTime (int year, int month, int day, int hour, int minute, int second, Calendar calendar)
\r
157 : this (year, month, day, hour, minute, second, 0, calendar) {}
\r
160 public DateTime (int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar)
\r
161 : this (year, month, day, hour, minute, second, millisecond)
\r
163 if (calendar == null)
\r
164 throw new ArgumentNullException();
\r
167 internal DateTime (bool check, TimeSpan value)
\r
169 if (check && (value.Ticks < MinValue.Ticks || value.Ticks > MaxValue.Ticks))
\r
170 throw new ArgumentOutOfRangeException ();
\r
177 public DateTime Date
\r
181 return new DateTime (Year, Month, Day);
\r
189 return FromTicks(Which.Month);
\r
198 return FromTicks(Which.Day);
\r
202 public DayOfWeek DayOfWeek
\r
206 return ( (DayOfWeek) ((ticks.Days+1) % 7) );
\r
210 public int DayOfYear
\r
214 return FromTicks(Which.DayYear);
\r
218 public TimeSpan TimeOfDay
\r
222 return new TimeSpan(ticks.Ticks % TimeSpan.TicksPerDay );
\r
231 return ticks.Hours;
\r
239 return ticks.Minutes;
\r
247 return ticks.Seconds;
\r
251 public int Millisecond
\r
255 return ticks.Milliseconds;
\r
259 [MethodImplAttribute(MethodImplOptions.InternalCall)]
\r
260 internal static extern long GetNow ();
\r
262 public static DateTime Now
\r
266 return new DateTime (true, GetNow ());
\r
274 return ticks.Ticks;
\r
278 public static DateTime Today
\r
282 return new DateTime (false, (GetNow () / TimeSpan.TicksPerDay) * TimeSpan.TicksPerDay);
\r
286 public static DateTime UtcNow
\r
289 return new DateTime (GetNow ());
\r
297 return FromTicks(Which.Year);
\r
303 public DateTime Add (TimeSpan ts)
\r
305 return new DateTime (true, ticks) + ts;
\r
308 public DateTime AddDays (double days)
\r
310 return AddMilliseconds (days * 86400000);
\r
313 public DateTime AddTicks (long t)
\r
315 return Add (new TimeSpan (t));
\r
318 public DateTime AddHours (double hours)
\r
320 return AddMilliseconds (hours * 3600000);
\r
323 public DateTime AddMilliseconds (double ms)
\r
327 msticks = (long) (ms += ms > 0 ? 0.5 : -0.5) * TimeSpan.TicksPerMillisecond ;
\r
329 return AddTicks (msticks);
\r
332 public DateTime AddMinutes (double minutes)
\r
334 return AddMilliseconds (minutes * 60000);
\r
337 public DateTime AddMonths (int months)
\r
339 int day, month, year, maxday ;
\r
343 month = this.Month + (months % 12);
\r
344 year = this.Year + months/12 ;
\r
348 month = 12 + month ;
\r
351 else if (month>12)
\r
356 maxday = DaysInMonth(year, month);
\r
360 temp = new DateTime (year, month, day);
\r
361 return temp.Add (this.TimeOfDay);
\r
364 public DateTime AddSeconds (double seconds)
\r
366 return AddMilliseconds (seconds*1000);
\r
369 public DateTime AddYears (int years )
\r
371 return AddMonths(years * 12);
\r
374 public static int Compare (DateTime t1, DateTime t2)
\r
376 if (t1.ticks < t2.ticks)
\r
378 else if (t1.ticks > t2.ticks)
\r
384 public int CompareTo (object v)
\r
389 if (!(v is System.DateTime))
\r
390 throw new ArgumentException (Locale.GetText (
\r
391 "Value is not a System.DateTime"));
\r
393 return Compare (this, (DateTime) v);
\r
396 public static int DaysInMonth (int year, int month)
\r
400 if (month < 1 || month >12)
\r
401 throw new ArgumentOutOfRangeException ();
\r
403 days = (IsLeapYear(year) ? daysmonthleap : daysmonth);
\r
404 return days[month];
\r
407 public override bool Equals (object o)
\r
409 if (!(o is System.DateTime))
\r
412 return ((DateTime) o).ticks == ticks;
\r
415 public static bool Equals (DateTime t1, DateTime t2 )
\r
417 return (t1.ticks == t2.ticks );
\r
420 public static DateTime FromFileTime (long fileTime)
\r
422 return new DateTime (w32file_epoch + fileTime);
\r
425 // TODO: Implement me.
\r
427 public static DateTime FromOADate (double d)
\r
429 return new DateTime(0);
\r
432 // TODO: Implement me.
\r
434 public string[] GetDateTimeFormats()
\r
439 //TODO: implement me
\r
441 public string[] GetDateTimeFormats(char format)
\r
446 // TODO: implement me
\r
448 public string[] GetDateTimeFormats(IFormatProvider provider)
\r
453 //TODO: implement me
\r
455 public string[] GetDateTimeFormats(char format,IFormatProvider provider )
\r
460 public override int GetHashCode ()
\r
462 return (int) ticks.Ticks;
\r
465 public TypeCode GetTypeCode ()
\r
467 return TypeCode.DateTime;
\r
470 public static bool IsLeapYear (int year)
\r
472 return ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ;
\r
475 public static DateTime Parse (string s)
\r
477 return Parse (s, null);
\r
480 public static DateTime Parse (string s, IFormatProvider fp)
\r
482 return Parse (s, null, DateTimeStyles.AllowWhiteSpaces);
\r
485 public static DateTime Parse (string s, IFormatProvider fp, DateTimeStyles styles)
\r
487 string[] formats = {
\r
488 // Full date and time
\r
489 "F", "G", "r", "s", "u", "U",
\r
490 // Full date and time, but no seconds
\r
496 // Only date, but no year
\r
498 // Only date, but no day
\r
502 return ParseExact (s, formats, fp, styles);
\r
505 public static DateTime ParseExact (string s, string format, IFormatProvider fp)
\r
507 return ParseExact (s, format, fp, DateTimeStyles.None);
\r
510 internal static int _ParseNumber (string s, int digits, bool leadingzero,
\r
511 bool sloppy_parsing, out int num_parsed)
\r
515 if (sloppy_parsing)
\r
516 leadingzero = false;
\r
518 if (!leadingzero) {
\r
519 int real_digits = 0;
\r
520 for (i = 0; i < digits; i++) {
\r
521 if ((i >= s.Length) || !Char.IsDigit (s[i]))
\r
527 digits = real_digits;
\r
530 if (s.Length < digits) {
\r
535 for (i = 0; i < digits; i++) {
\r
537 if (!Char.IsDigit (c)) {
\r
542 number = number * 10 + (byte) (c - '0');
\r
545 num_parsed = digits;
\r
549 internal static int _ParseEnum (string s, string[] values, out int num_parsed)
\r
553 for (i = 0; i < values.Length; i++) {
\r
554 if (s.Length < values[i].Length)
\r
556 String tmp = s.Substring (0, values[i].Length);
\r
557 if (String.Compare (tmp, values[i], true) == 0) {
\r
558 num_parsed = values[i].Length;
\r
567 internal static bool _ParseString (string s, int maxlength, string value, out int num_parsed)
\r
570 value = value.Substring (0, maxlength);
\r
572 s = s.Substring (0, value.Length);
\r
574 if (String.Compare (s, value, true) == 0) {
\r
575 num_parsed = value.Length;
\r
583 internal static bool _DoParse (string s, string format, bool exact,
\r
584 out DateTime result,
\r
585 DateTimeFormatInfo dfi,
\r
586 DateTimeStyles style)
\r
588 bool useutc = false, use_localtime = true;
\r
589 bool sloppy_parsing = false;
\r
591 if (format.Length == 1)
\r
592 format = _GetStandardPattern (format[0], dfi, out useutc);
\r
594 if ((style & DateTimeStyles.AllowLeadingWhite) != 0) {
\r
595 format = format.TrimStart (null);
\r
596 s = s.TrimStart (null);
\r
599 if ((style & DateTimeStyles.AllowTrailingWhite) != 0) {
\r
600 format = format.TrimEnd (null);
\r
601 s = s.TrimEnd (null);
\r
604 if ((style & DateTimeStyles.AllowInnerWhite) != 0)
\r
605 sloppy_parsing = true;
\r
607 char[] chars = format.ToCharArray ();
\r
608 int len = format.Length, pos = 0, num = 0;
\r
610 int day = -1, dayofweek = -1, month = -1, year = -1;
\r
611 int hour = -1, minute = -1, second = -1, millisecond = -1;
\r
613 int tzsign = -1, tzoffset = -1, tzoffmin = -1;
\r
615 result = new DateTime (0);
\r
616 while (pos+num < len)
\r
621 if (Char.IsWhiteSpace (s[0])) {
\r
622 s = s.Substring (1);
\r
624 if (Char.IsWhiteSpace (chars[pos])) {
\r
629 if ((style & DateTimeStyles.AllowInnerWhite) == 0)
\r
633 if (chars[pos] == '\'') {
\r
635 while (pos+num < len) {
\r
636 if (chars[pos+num] == '\'')
\r
641 if (s[0] != chars[pos+num])
\r
643 s = s.Substring (1);
\r
653 } else if (chars[pos] == '\\') {
\r
657 if (s[0] != chars[pos+num])
\r
659 s = s.Substring (1);
\r
665 } else if (chars[pos] == '%') {
\r
670 if ((pos+num+1 < len) && (chars[pos+num+1] == chars[pos+num])) {
\r
675 int num_parsed = 0;
\r
677 switch (chars[pos])
\r
683 day = _ParseNumber (s, 2, false, sloppy_parsing, out num_parsed);
\r
685 day = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
687 dayofweek = _ParseEnum (s, dfi.AbbreviatedDayNames, out num_parsed);
\r
690 dayofweek = _ParseEnum (s, dfi.DayNames, out num_parsed);
\r
698 month = _ParseNumber (s, 2, false, sloppy_parsing, out num_parsed);
\r
700 month = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
702 month = _ParseEnum (s, dfi.AbbreviatedMonthNames , out num_parsed) + 1;
\r
705 month = _ParseEnum (s, dfi.MonthNames, out num_parsed) + 1;
\r
708 if ((month < 1) || (month > 12))
\r
715 year = _ParseNumber (s, 2, false, sloppy_parsing, out num_parsed);
\r
716 year += (year < 30) ? 2000 : 1900;
\r
717 } else if (num < 3) {
\r
718 year = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
719 year += (year < 30) ? 2000 : 1900;
\r
721 year = _ParseNumber (s, 4, false, sloppy_parsing, out num_parsed);
\r
729 hour = _ParseNumber (s, 2, false, sloppy_parsing, out num_parsed);
\r
732 hour = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
739 if ((hour != -1) || (ampm >= 0))
\r
742 hour = _ParseNumber (s, 2, false, sloppy_parsing, out num_parsed);
\r
745 hour = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
756 minute = _ParseNumber (s, 2, false, sloppy_parsing, out num_parsed);
\r
759 minute = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
769 second = _ParseNumber (s, 2, false, sloppy_parsing, out num_parsed);
\r
772 second = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
779 if (millisecond != -1)
\r
781 num = Math.Min (num, 6);
\r
782 millisecond = _ParseNumber (s, num+1, true, sloppy_parsing, out num_parsed);
\r
789 if (_ParseString (s, 1, dfi.AMDesignator, out num_parsed))
\r
791 else if (_ParseString (s, 1, dfi.PMDesignator, out num_parsed))
\r
798 if (_ParseString (s, 0, dfi.AMDesignator, out num_parsed))
\r
800 else if (_ParseString (s, 0, dfi.PMDesignator, out num_parsed))
\r
812 else if (s[0] == '-')
\r
816 s = s.Substring (1);
\r
818 tzoffset = _ParseNumber (s, 2, false, sloppy_parsing, out num_parsed);
\r
820 tzoffset = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
823 tzoffset = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
824 if (num_parsed < 0)
\r
826 s = s.Substring (num_parsed);
\r
827 if (!_ParseString (s, 0, dfi.TimeSeparator, out num_parsed))
\r
829 s = s.Substring (num_parsed);
\r
830 tzoffmin = _ParseNumber (s, 2, true, sloppy_parsing, out num_parsed);
\r
831 if (num_parsed < 0)
\r
837 if (!_ParseString (s, 0, dfi.TimeSeparator, out num_parsed))
\r
841 if (!_ParseString (s, 0, dfi.DateSeparator, out num_parsed))
\r
845 if (s[0] != chars[pos])
\r
852 if (num_parsed < 0)
\r
855 s = s.Substring (num_parsed);
\r
857 pos = pos + num + 1;
\r
867 if (millisecond == -1)
\r
870 // If no date was given
\r
871 if ((day == -1) && (month == -1) && (year == -1)) {
\r
872 if ((style & DateTimeStyles.NoCurrentDateDefault) != 0) {
\r
878 month = Today.Month;
\r
888 if ((style & DateTimeStyles.NoCurrentDateDefault) != 0)
\r
897 result = new DateTime (year, month, day, hour, minute, second, millisecond);
\r
899 if ((dayofweek != -1) && (dayofweek != (int) result.DayOfWeek))
\r
900 throw new FormatException (Locale.GetText ("String was not recognized as valid DateTime because the day of week was incorrect."));
\r
902 // If no timezone was specified, default to the local timezone.
\r
903 TimeSpan utcoffset;
\r
905 utcoffset = new TimeSpan (0, 0, 0);
\r
906 else if (tzsign == -1) {
\r
907 TimeZone tz = TimeZone.CurrentTimeZone;
\r
908 utcoffset = tz.GetUtcOffset (result);
\r
910 if ((style & DateTimeStyles.AdjustToUniversal) != 0)
\r
911 use_localtime = false;
\r
913 if (tzoffmin == -1)
\r
915 if (tzoffset == -1)
\r
918 tzoffset = -tzoffset;
\r
920 utcoffset = new TimeSpan (tzoffset, tzoffmin, 0);
\r
923 long newticks = (result.ticks - utcoffset).Ticks;
\r
925 result = new DateTime (use_localtime, newticks);
\r
931 public static DateTime ParseExact (string s, string format,
\r
932 IFormatProvider fp, DateTimeStyles style)
\r
936 formats = new string [1];
\r
937 formats[0] = format;
\r
939 return ParseExact (s, formats, fp, style);
\r
942 public static DateTime ParseExact (string s, string[] formats,
\r
943 IFormatProvider fp,
\r
944 DateTimeStyles style)
\r
946 DateTimeFormatInfo dfi = DateTimeFormatInfo.GetInstance (fp);
\r
949 throw new ArgumentNullException (Locale.GetText ("s is null"));
\r
950 if (formats.Length == 0)
\r
951 throw new ArgumentNullException (Locale.GetText ("format is null"));
\r
954 for (i = 0; i < formats.Length; i++)
\r
958 if (_DoParse (s, formats[i], true, out result, dfi, style))
\r
962 throw new FormatException ();
\r
965 public TimeSpan Subtract(DateTime dt)
\r
967 return new TimeSpan(ticks.Ticks) - dt.ticks;
\r
970 public DateTime Subtract(TimeSpan ts)
\r
974 newticks = (new TimeSpan (ticks.Ticks)) - ts;
\r
975 return new DateTime(true,newticks);
\r
978 public long ToFileTime()
\r
980 if(ticks.Ticks < w32file_epoch) {
\r
981 throw new ArgumentOutOfRangeException("file time is not valid");
\r
984 return(ticks.Ticks - w32file_epoch);
\r
987 public string ToLongDateString()
\r
989 return ToString ("D");
\r
992 public string ToLongTimeString()
\r
994 return ToString ("T");
\r
998 public double ToOADate()
\r
1000 // TODO implement me
\r
1004 public string ToShortDateString()
\r
1006 return ToString ("d");
\r
1009 public string ToShortTimeString()
\r
1011 return ToString ("t");
\r
1014 public override string ToString ()
\r
1016 return ToString ("G", null);
\r
1019 public string ToString (IFormatProvider fp)
\r
1021 return ToString (null, fp);
\r
1024 public string ToString (string format)
\r
1026 return ToString (format, null);
\r
1029 internal static string _GetStandardPattern (char format, DateTimeFormatInfo dfi, out bool useutc)
\r
1038 pattern = dfi.ShortDatePattern;
\r
1041 pattern = dfi.LongDatePattern;
\r
1044 pattern = dfi.LongDatePattern + " " + dfi.ShortTimePattern;
\r
1047 pattern = dfi.FullDateTimePattern;
\r
1050 pattern = dfi.ShortDatePattern + " " + dfi.ShortTimePattern;
\r
1053 pattern = dfi.ShortDatePattern + " " + dfi.LongTimePattern;
\r
1057 pattern = dfi.MonthDayPattern;
\r
1061 pattern = dfi.RFC1123Pattern;
\r
1062 // commented by LP 09/jun/2002, rfc 1123 pattern is always in GMT
\r
1066 pattern = dfi.SortableDateTimePattern;
\r
1069 pattern = dfi.ShortTimePattern;
\r
1072 pattern = dfi.LongTimePattern;
\r
1075 pattern = dfi.UniversalSortableDateTimePattern;
\r
1079 pattern = dfi.LongDatePattern + " " + dfi.LongTimePattern;
\r
1084 pattern = dfi.YearMonthPattern;
\r
1094 internal string _ToString (string format, DateTimeFormatInfo dfi)
\r
1096 String str = null, result = null;
\r
1097 char[] chars = format.ToCharArray ();
\r
1098 int len = format.Length, pos = 0, num = 0;
\r
1100 TimeZone tz = TimeZone.CurrentTimeZone;
\r
1101 TimeSpan utcoffset = tz.GetUtcOffset (this);
\r
1105 if (chars[pos] == '\'') {
\r
1107 while (pos+num <= len) {
\r
1108 if (chars[pos+num] == '\'')
\r
1111 result += chars[pos+num];
\r
1114 if (pos+num > len)
\r
1115 throw new FormatException (Locale.GetText ("The specified format is invalid"));
\r
1120 } else if (chars[pos] == '\\') {
\r
1122 throw new FormatException (Locale.GetText ("The specified format is invalid"));
\r
1124 result += chars[pos+1];
\r
1127 } else if (chars[pos] == '%') {
\r
1132 if ((pos+num+1 < len) && (chars[pos+num+1] == chars[pos+num])) {
\r
1137 switch (chars[pos])
\r
1141 str = Day.ToString ("d");
\r
1142 else if (num == 1)
\r
1143 str = Day.ToString ("d02");
\r
1144 else if (num == 2)
\r
1145 str = dfi.GetAbbreviatedDayName (DayOfWeek);
\r
1147 str = dfi.GetDayName (DayOfWeek);
\r
1153 str = Month.ToString ("d");
\r
1154 else if (num == 1)
\r
1155 str = Month.ToString ("d02");
\r
1156 else if (num == 2)
\r
1157 str = dfi.GetAbbreviatedMonthName (Month);
\r
1159 str = dfi.GetMonthName (Month);
\r
1165 int shortyear = Year % 100;
\r
1166 str = shortyear.ToString ("d");
\r
1167 } else if (num == 1) {
\r
1168 int shortyear = Year % 100;
\r
1169 str = shortyear.ToString ("d02");
\r
1171 str = Year.ToString ("d");
\r
1179 num = Math.Min (num, 6);
\r
1181 long ms = (long) Millisecond;
\r
1183 for (int i = 0; i < num; i++)
\r
1185 long maxexp = TimeSpan.TicksPerMillisecond;
\r
1187 exp = Math.Min (exp, maxexp);
\r
1188 ms = ms * exp / maxexp;
\r
1190 String prec = (num+1).ToString ("d02");
\r
1191 str = ms.ToString (String.Concat ("d", prec));
\r
1196 int shorthour = Hour % 12;
\r
1197 str = shorthour.ToString ("d");
\r
1199 int shorthour = Hour % 12;
\r
1200 str = shorthour.ToString ("d02");
\r
1206 str = Hour.ToString ("d");
\r
1208 str = Hour.ToString ("d02");
\r
1214 str = Minute.ToString ("d");
\r
1216 str = Minute.ToString ("d02");
\r
1222 str = Second.ToString ("d");
\r
1224 str = Second.ToString ("d02");
\r
1230 str = dfi.AMDesignator;
\r
1232 str = dfi.PMDesignator;
\r
1235 str = str.Substring (0,1);
\r
1241 int offset = utcoffset.Hours;
\r
1242 str = offset.ToString ("d");
\r
1244 str = String.Concat ("+", str);
\r
1245 } else if (num == 1) {
\r
1246 int offset = utcoffset.Hours;
\r
1247 str = offset.ToString ("d02");
\r
1249 str = String.Concat ("+", str);
\r
1250 } else if (num == 2) {
\r
1251 int offhour = utcoffset.Hours;
\r
1252 int offminute = utcoffset.Minutes;
\r
1253 str = offhour.ToString ("d02");
\r
1254 str = String.Concat (str, dfi.TimeSeparator);
\r
1255 str = String.Concat (str, offminute.ToString ("d02"));
\r
1257 str = String.Concat ("+", str);
\r
1262 str = dfi.TimeSeparator;
\r
1266 str = dfi.DateSeparator;
\r
1270 str = String.Concat (chars [pos]);
\r
1275 result = String.Concat (result, str);
\r
1284 public string ToString (string format, IFormatProvider fp)
\r
1286 DateTimeFormatInfo dfi = DateTimeFormatInfo.GetInstance(fp);
\r
1288 if (format == null)
\r
1289 format = dfi.FullDateTimePattern;
\r
1291 bool useutc = false;
\r
1293 if (format.Length == 1) {
\r
1294 char fchar = (format.ToCharArray ())[0];
\r
1295 format = _GetStandardPattern (fchar, dfi, out useutc);
\r
1299 return this.ToUniversalTime ()._ToString (format, dfi);
\r
1301 return this._ToString (format, dfi);
\r
1304 public DateTime ToLocalTime()
\r
1306 TimeZone tz = TimeZone.CurrentTimeZone;
\r
1308 TimeSpan offset = tz.GetUtcOffset (this);
\r
1310 return new DateTime (true, ticks + offset);
\r
1313 public DateTime ToUniversalTime()
\r
1315 TimeZone tz = TimeZone.CurrentTimeZone;
\r
1317 TimeSpan offset = tz.GetUtcOffset (this);
\r
1319 return new DateTime (true, ticks - offset);
\r
1324 public static DateTime operator +(DateTime d, TimeSpan t)
\r
1326 return new DateTime (true, d.ticks + t);
\r
1329 public static bool operator ==(DateTime d1, DateTime d2)
\r
1331 return (d1.ticks == d2.ticks);
\r
1334 public static bool operator >(DateTime t1,DateTime t2)
\r
1336 return (t1.ticks > t2.ticks);
\r
1339 public static bool operator >=(DateTime t1,DateTime t2)
\r
1341 return (t1.ticks >= t2.ticks);
\r
1344 public static bool operator !=(DateTime d1, DateTime d2)
\r
1346 return (d1.ticks != d2.ticks);
\r
1349 public static bool operator <(DateTime t1, DateTime t2)
\r
1351 return (t1.ticks < t2.ticks );
\r
1354 public static bool operator <=(DateTime t1,DateTime t2)
\r
1356 return (t1.ticks <= t2.ticks);
\r
1359 public static TimeSpan operator -(DateTime d1,DateTime d2)
\r
1361 return new TimeSpan((d1.ticks - d2.ticks).Ticks);
\r
1364 public static DateTime operator -(DateTime d,TimeSpan t)
\r
1366 return new DateTime (true, d.ticks - t);
\r
1369 bool IConvertible.ToBoolean(IFormatProvider provider)
\r
1371 throw new InvalidCastException();
\r
1374 byte IConvertible.ToByte(IFormatProvider provider)
\r
1376 throw new InvalidCastException();
\r
1379 char IConvertible.ToChar(IFormatProvider provider)
\r
1381 throw new InvalidCastException();
\r
1384 // TODO Implement me
\r
1386 public System.DateTime ToDateTime(IFormatProvider provider)
\r
1388 return new System.DateTime(true,this.ticks);
\r
1391 decimal IConvertible.ToDecimal(IFormatProvider provider)
\r
1393 throw new InvalidCastException();
\r
1396 double IConvertible.ToDouble(IFormatProvider provider)
\r
1398 throw new InvalidCastException();
\r
1401 Int16 IConvertible.ToInt16(IFormatProvider provider)
\r
1403 throw new InvalidCastException();
\r
1406 Int32 IConvertible.ToInt32(IFormatProvider provider)
\r
1408 throw new InvalidCastException();
\r
1411 Int64 IConvertible.ToInt64(IFormatProvider provider)
\r
1413 throw new InvalidCastException();
\r
1416 [CLSCompliant(false)]
\r
1417 SByte IConvertible.ToSByte(IFormatProvider provider)
\r
1419 throw new InvalidCastException();
\r
1422 Single IConvertible.ToSingle(IFormatProvider provider)
\r
1424 throw new InvalidCastException();
\r
1427 object IConvertible.ToType(Type conversionType,IFormatProvider provider)
\r
1429 throw new InvalidCastException();
\r
1432 UInt16 IConvertible.ToUInt16(IFormatProvider provider)
\r
1434 throw new InvalidCastException();
\r
1437 [CLSCompliant(false)]
\r
1438 UInt32 IConvertible.ToUInt32(IFormatProvider provider)
\r
1440 throw new InvalidCastException();
\r
1443 [CLSCompliant(false)]
\r
1444 UInt64 IConvertible.ToUInt64(IFormatProvider provider)
\r
1446 throw new InvalidCastException();
\r
1453 public enum DayOfWeek
\r