/tags/Daily_20080505/Newtonsoft.Json/DateTimeOffset.cs

# · C# · 544 lines · 466 code · 75 blank · 3 comment · 41 complexity · 3954847c689a6d86208e5b7df59af1eb MD5 · raw file

  1. #if PocketPC
  2. #pragma warning disable 1591
  3. // This class is... borrowed from .NET and Microsoft for a short time.
  4. // Hopefully Microsoft will add DateTimeOffset to the compact framework
  5. // or I will rewrite a striped down version of this file myself
  6. using System.Globalization;
  7. using System.Runtime.InteropServices;
  8. using System.Runtime.Serialization;
  9. using System.Security.Permissions;
  10. using System;
  11. namespace System
  12. {
  13. public struct DateTimeOffset : IComparable, IFormattable, IComparable<DateTimeOffset>, IEquatable<DateTimeOffset>
  14. {
  15. private DateTime _dateTime;
  16. private short _offsetMinutes;
  17. internal const long MaxOffset = 0x7558bdb000L;
  18. public static readonly DateTimeOffset MaxValue;
  19. internal const long MinOffset = -504000000000L;
  20. public static readonly DateTimeOffset MinValue;
  21. static DateTimeOffset()
  22. {
  23. MinValue = new DateTimeOffset(0L, TimeSpan.Zero);
  24. MaxValue = new DateTimeOffset(0x2bca2875f4373fffL, TimeSpan.Zero);
  25. }
  26. public DateTimeOffset(System.DateTime dateTime)
  27. {
  28. TimeSpan utcOffset;
  29. if (dateTime.Kind != DateTimeKind.Utc)
  30. {
  31. utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(dateTime);
  32. }
  33. else
  34. {
  35. utcOffset = new TimeSpan(0L);
  36. }
  37. this._offsetMinutes = ValidateOffset(utcOffset);
  38. this._dateTime = ValidateDate(dateTime, utcOffset);
  39. }
  40. public DateTimeOffset(System.DateTime dateTime, TimeSpan offset)
  41. {
  42. if (dateTime.Kind == DateTimeKind.Local)
  43. {
  44. if (offset != TimeZone.CurrentTimeZone.GetUtcOffset(dateTime))
  45. {
  46. throw new ArgumentException("The UTC Offset of the local dateTime parameter does not match the offset argument.", "offset");
  47. }
  48. }
  49. else if ((dateTime.Kind == DateTimeKind.Utc) && (offset != TimeSpan.Zero))
  50. {
  51. throw new ArgumentException("The UTC Offset for Utc DateTime instances must be 0.", "offset");
  52. }
  53. this._offsetMinutes = ValidateOffset(offset);
  54. this._dateTime = ValidateDate(dateTime, offset);
  55. }
  56. public DateTimeOffset(long ticks, TimeSpan offset)
  57. {
  58. this._offsetMinutes = ValidateOffset(offset);
  59. System.DateTime dateTime = new System.DateTime(ticks);
  60. this._dateTime = ValidateDate(dateTime, offset);
  61. }
  62. public DateTimeOffset(int year, int month, int day, int hour, int minute, int second, TimeSpan offset)
  63. {
  64. this._offsetMinutes = ValidateOffset(offset);
  65. this._dateTime = ValidateDate(new System.DateTime(year, month, day, hour, minute, second), offset);
  66. }
  67. public DateTimeOffset(int year, int month, int day, int hour, int minute, int second, int millisecond, TimeSpan offset)
  68. {
  69. this._offsetMinutes = ValidateOffset(offset);
  70. this._dateTime = ValidateDate(new System.DateTime(year, month, day, hour, minute, second, millisecond), offset);
  71. }
  72. public DateTimeOffset(int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar, TimeSpan offset)
  73. {
  74. this._offsetMinutes = ValidateOffset(offset);
  75. this._dateTime = ValidateDate(new System.DateTime(year, month, day, hour, minute, second, millisecond, calendar), offset);
  76. }
  77. public DateTimeOffset Add(TimeSpan timeSpan)
  78. {
  79. return new DateTimeOffset(this.ClockDateTime.Add(timeSpan), this.Offset);
  80. }
  81. public DateTimeOffset AddDays(double days)
  82. {
  83. return new DateTimeOffset(this.ClockDateTime.AddDays(days), this.Offset);
  84. }
  85. public DateTimeOffset AddHours(double hours)
  86. {
  87. return new DateTimeOffset(this.ClockDateTime.AddHours(hours), this.Offset);
  88. }
  89. public DateTimeOffset AddMilliseconds(double milliseconds)
  90. {
  91. return new DateTimeOffset(this.ClockDateTime.AddMilliseconds(milliseconds), this.Offset);
  92. }
  93. public DateTimeOffset AddMinutes(double minutes)
  94. {
  95. return new DateTimeOffset(this.ClockDateTime.AddMinutes(minutes), this.Offset);
  96. }
  97. public DateTimeOffset AddMonths(int months)
  98. {
  99. return new DateTimeOffset(this.ClockDateTime.AddMonths(months), this.Offset);
  100. }
  101. public DateTimeOffset AddSeconds(double seconds)
  102. {
  103. return new DateTimeOffset(this.ClockDateTime.AddSeconds(seconds), this.Offset);
  104. }
  105. public DateTimeOffset AddTicks(long ticks)
  106. {
  107. return new DateTimeOffset(this.ClockDateTime.AddTicks(ticks), this.Offset);
  108. }
  109. public DateTimeOffset AddYears(int years)
  110. {
  111. return new DateTimeOffset(this.ClockDateTime.AddYears(years), this.Offset);
  112. }
  113. public static int Compare(DateTimeOffset first, DateTimeOffset second)
  114. {
  115. return System.DateTime.Compare(first.UtcDateTime, second.UtcDateTime);
  116. }
  117. public int CompareTo(DateTimeOffset other)
  118. {
  119. System.DateTime utcDateTime = other.UtcDateTime;
  120. System.DateTime time2 = this.UtcDateTime;
  121. if (time2 > utcDateTime)
  122. {
  123. return 1;
  124. }
  125. if (time2 < utcDateTime)
  126. {
  127. return -1;
  128. }
  129. return 0;
  130. }
  131. public bool Equals(DateTimeOffset other)
  132. {
  133. return this.UtcDateTime.Equals(other.UtcDateTime);
  134. }
  135. public override bool Equals(object obj)
  136. {
  137. if (obj is DateTimeOffset)
  138. {
  139. DateTimeOffset offset = (DateTimeOffset)obj;
  140. return this.UtcDateTime.Equals(offset.UtcDateTime);
  141. }
  142. return false;
  143. }
  144. public static bool Equals(DateTimeOffset first, DateTimeOffset second)
  145. {
  146. return System.DateTime.Equals(first.UtcDateTime, second.UtcDateTime);
  147. }
  148. public bool EqualsExact(DateTimeOffset other)
  149. {
  150. return (((this.ClockDateTime == other.ClockDateTime) && (this.Offset == other.Offset)) && (this.ClockDateTime.Kind == other.ClockDateTime.Kind));
  151. }
  152. public static DateTimeOffset FromFileTime(long fileTime)
  153. {
  154. return new DateTimeOffset(System.DateTime.FromFileTime(fileTime));
  155. }
  156. public override int GetHashCode()
  157. {
  158. return this.UtcDateTime.GetHashCode();
  159. }
  160. public static DateTimeOffset operator +(DateTimeOffset dateTimeTz, TimeSpan timeSpan)
  161. {
  162. return new DateTimeOffset(dateTimeTz.ClockDateTime + timeSpan, dateTimeTz.Offset);
  163. }
  164. public static bool operator ==(DateTimeOffset left, DateTimeOffset right)
  165. {
  166. return (left.UtcDateTime == right.UtcDateTime);
  167. }
  168. public static bool operator >(DateTimeOffset left, DateTimeOffset right)
  169. {
  170. return (left.UtcDateTime > right.UtcDateTime);
  171. }
  172. public static bool operator >=(DateTimeOffset left, DateTimeOffset right)
  173. {
  174. return (left.UtcDateTime >= right.UtcDateTime);
  175. }
  176. public static implicit operator DateTimeOffset(System.DateTime dateTime)
  177. {
  178. return new DateTimeOffset(dateTime);
  179. }
  180. public static bool operator !=(DateTimeOffset left, DateTimeOffset right)
  181. {
  182. return (left.UtcDateTime != right.UtcDateTime);
  183. }
  184. public static bool operator <(DateTimeOffset left, DateTimeOffset right)
  185. {
  186. return (left.UtcDateTime < right.UtcDateTime);
  187. }
  188. public static bool operator <=(DateTimeOffset left, DateTimeOffset right)
  189. {
  190. return (left.UtcDateTime <= right.UtcDateTime);
  191. }
  192. public static TimeSpan operator -(DateTimeOffset left, DateTimeOffset right)
  193. {
  194. return (TimeSpan)(left.UtcDateTime - right.UtcDateTime);
  195. }
  196. public static DateTimeOffset operator -(DateTimeOffset dateTimeTz, TimeSpan timeSpan)
  197. {
  198. return new DateTimeOffset(dateTimeTz.ClockDateTime - timeSpan, dateTimeTz.Offset);
  199. }
  200. public static DateTimeOffset Parse(string input)
  201. {
  202. return new DateTimeOffset(DateTime.Parse(input, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None));
  203. }
  204. public static DateTimeOffset Parse(string input, IFormatProvider formatProvider)
  205. {
  206. return Parse(input, formatProvider, DateTimeStyles.None);
  207. }
  208. public static DateTimeOffset Parse(string input, IFormatProvider formatProvider, DateTimeStyles styles)
  209. {
  210. styles = ValidateStyles(styles, "styles");
  211. return new DateTimeOffset(DateTime.Parse(input, DateTimeFormatInfo.GetInstance(formatProvider), styles));
  212. }
  213. public static DateTimeOffset ParseExact(string input, string format, IFormatProvider formatProvider)
  214. {
  215. return ParseExact(input, format, formatProvider, DateTimeStyles.None);
  216. }
  217. public static DateTimeOffset ParseExact(string input, string format, IFormatProvider formatProvider, DateTimeStyles styles)
  218. {
  219. styles = ValidateStyles(styles, "styles");
  220. return new DateTimeOffset(DateTime.ParseExact(input, format, DateTimeFormatInfo.GetInstance(formatProvider), styles));
  221. }
  222. public static DateTimeOffset ParseExact(string input, string[] formats, IFormatProvider formatProvider, DateTimeStyles styles)
  223. {
  224. styles = ValidateStyles(styles, "styles");
  225. return new DateTimeOffset(DateTime.ParseExact(input, formats, DateTimeFormatInfo.GetInstance(formatProvider), styles));
  226. }
  227. public TimeSpan Subtract(DateTimeOffset value)
  228. {
  229. return this.UtcDateTime.Subtract(value.UtcDateTime);
  230. }
  231. public DateTimeOffset Subtract(TimeSpan value)
  232. {
  233. return new DateTimeOffset(this.ClockDateTime.Subtract(value), this.Offset);
  234. }
  235. int IComparable.CompareTo(object obj)
  236. {
  237. if (obj == null)
  238. {
  239. return 1;
  240. }
  241. if (!(obj is DateTimeOffset))
  242. {
  243. throw new ArgumentException("Object must be of type DateTimeOffset.");
  244. }
  245. DateTimeOffset offset = (DateTimeOffset)obj;
  246. System.DateTime utcDateTime = offset.UtcDateTime;
  247. System.DateTime time2 = this.UtcDateTime;
  248. if (time2 > utcDateTime)
  249. {
  250. return 1;
  251. }
  252. if (time2 < utcDateTime)
  253. {
  254. return -1;
  255. }
  256. return 0;
  257. }
  258. public long ToFileTime()
  259. {
  260. return this.UtcDateTime.ToFileTime();
  261. }
  262. public DateTimeOffset ToLocalTime()
  263. {
  264. return new DateTimeOffset(this.UtcDateTime.ToLocalTime());
  265. }
  266. public DateTimeOffset ToOffset(TimeSpan offset)
  267. {
  268. System.DateTime time = this._dateTime + offset;
  269. return new DateTimeOffset(time.Ticks, offset);
  270. }
  271. public string ToString(string format, IFormatProvider formatProvider)
  272. {
  273. if (!string.IsNullOrEmpty(format))
  274. {
  275. format = format.Replace("K", "zzz");
  276. format = format.Replace("zzz", Offset.Hours.ToString("+00;-00", CultureInfo.InvariantCulture) + ":" + Offset.Minutes.ToString("00;00", CultureInfo.InvariantCulture));
  277. format = format.Replace("zz", Offset.Hours.ToString("+00;-00", CultureInfo.InvariantCulture));
  278. format = format.Replace("z", Offset.Hours.ToString("+0;-0", CultureInfo.InvariantCulture));
  279. }
  280. return ClockDateTime.ToString(format, formatProvider);
  281. }
  282. public DateTimeOffset ToUniversalTime()
  283. {
  284. return new DateTimeOffset(this.UtcDateTime);
  285. }
  286. private static System.DateTime ValidateDate(System.DateTime dateTime, TimeSpan offset)
  287. {
  288. long ticks = dateTime.Ticks - offset.Ticks;
  289. if ((ticks < 0L) || (ticks > 0x2bca2875f4373fffL))
  290. {
  291. throw new ArgumentOutOfRangeException("offset", "The UTC time represented when the offset is applied must be between year 0 and 10,000.");
  292. }
  293. return new System.DateTime(ticks, DateTimeKind.Unspecified);
  294. }
  295. private static short ValidateOffset(TimeSpan offset)
  296. {
  297. long ticks = offset.Ticks;
  298. if ((ticks % 0x23c34600L) != 0L)
  299. {
  300. throw new ArgumentException("Offset must be specified in whole minutes.", "offset");
  301. }
  302. if ((ticks < -504000000000L) || (ticks > 0x7558bdb000L))
  303. {
  304. throw new ArgumentOutOfRangeException("offset", "Offset must be within plus or minus 14 hours.");
  305. }
  306. return (short)(offset.Ticks / 0x23c34600L);
  307. }
  308. private static DateTimeStyles ValidateStyles(DateTimeStyles style, string parameterName)
  309. {
  310. if ((style & ~(DateTimeStyles.RoundtripKind | DateTimeStyles.AssumeUniversal | DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal | DateTimeStyles.NoCurrentDateDefault | DateTimeStyles.AllowWhiteSpaces)) != DateTimeStyles.None)
  311. {
  312. throw new ArgumentException("An undefined DateTimeStyles value is being used.", parameterName);
  313. }
  314. if (((style & DateTimeStyles.AssumeLocal) != DateTimeStyles.None) && ((style & DateTimeStyles.AssumeUniversal) != DateTimeStyles.None))
  315. {
  316. throw new ArgumentException("The DateTimeStyles values AssumeLocal and AssumeUniversal cannot be used together.", parameterName);
  317. }
  318. if ((style & DateTimeStyles.NoCurrentDateDefault) != DateTimeStyles.None)
  319. {
  320. throw new ArgumentException("The DateTimeStyles value 'NoCurrentDateDefault' is not allowed when parsing DateTimeOffset.", parameterName);
  321. }
  322. style &= ~DateTimeStyles.RoundtripKind;
  323. style &= ~DateTimeStyles.AssumeLocal;
  324. return style;
  325. }
  326. private System.DateTime ClockDateTime
  327. {
  328. get
  329. {
  330. System.DateTime time = this._dateTime + this.Offset;
  331. return new System.DateTime(time.Ticks, DateTimeKind.Unspecified);
  332. }
  333. }
  334. public System.DateTime Date
  335. {
  336. get
  337. {
  338. return this.ClockDateTime.Date;
  339. }
  340. }
  341. public System.DateTime DateTime
  342. {
  343. get
  344. {
  345. return this.ClockDateTime;
  346. }
  347. }
  348. public int Day
  349. {
  350. get
  351. {
  352. return this.ClockDateTime.Day;
  353. }
  354. }
  355. public System.DayOfWeek DayOfWeek
  356. {
  357. get
  358. {
  359. return this.ClockDateTime.DayOfWeek;
  360. }
  361. }
  362. public int DayOfYear
  363. {
  364. get
  365. {
  366. return this.ClockDateTime.DayOfYear;
  367. }
  368. }
  369. public int Hour
  370. {
  371. get
  372. {
  373. return this.ClockDateTime.Hour;
  374. }
  375. }
  376. public System.DateTime LocalDateTime
  377. {
  378. get
  379. {
  380. return this.UtcDateTime.ToLocalTime();
  381. }
  382. }
  383. public int Millisecond
  384. {
  385. get
  386. {
  387. return this.ClockDateTime.Millisecond;
  388. }
  389. }
  390. public int Minute
  391. {
  392. get
  393. {
  394. return this.ClockDateTime.Minute;
  395. }
  396. }
  397. public int Month
  398. {
  399. get
  400. {
  401. return this.ClockDateTime.Month;
  402. }
  403. }
  404. public static DateTimeOffset Now
  405. {
  406. get
  407. {
  408. return new DateTimeOffset(System.DateTime.Now);
  409. }
  410. }
  411. public TimeSpan Offset
  412. {
  413. get
  414. {
  415. return new TimeSpan(0, this._offsetMinutes, 0);
  416. }
  417. }
  418. public int Second
  419. {
  420. get
  421. {
  422. return this.ClockDateTime.Second;
  423. }
  424. }
  425. public long Ticks
  426. {
  427. get
  428. {
  429. return this.ClockDateTime.Ticks;
  430. }
  431. }
  432. public TimeSpan TimeOfDay
  433. {
  434. get
  435. {
  436. return this.ClockDateTime.TimeOfDay;
  437. }
  438. }
  439. public System.DateTime UtcDateTime
  440. {
  441. get
  442. {
  443. return System.DateTime.SpecifyKind(this._dateTime, DateTimeKind.Utc);
  444. }
  445. }
  446. public static DateTimeOffset UtcNow
  447. {
  448. get
  449. {
  450. return new DateTimeOffset(System.DateTime.UtcNow);
  451. }
  452. }
  453. public long UtcTicks
  454. {
  455. get
  456. {
  457. return this.UtcDateTime.Ticks;
  458. }
  459. }
  460. public int Year
  461. {
  462. get
  463. {
  464. return this.ClockDateTime.Year;
  465. }
  466. }
  467. }
  468. }
  469. #endif