DateTimeOffsetAdapter.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.Runtime.Serialization
  5. {
  6. using System;
  7. using System.Reflection;
  8. using System.Xml;
  9. using System.Globalization;
  10. [DataContract(Name = "DateTimeOffset", Namespace = "http://schemas.datacontract.org/2004/07/System")]
  11. #if USE_REFEMIT
  12. public struct DateTimeOffsetAdapter
  13. #else
  14. internal struct DateTimeOffsetAdapter
  15. #endif
  16. {
  17. DateTime utcDateTime;
  18. short offsetMinutes;
  19. public DateTimeOffsetAdapter(DateTime dateTime, short offsetMinutes)
  20. {
  21. this.utcDateTime = dateTime;
  22. this.offsetMinutes = offsetMinutes;
  23. }
  24. [DataMember(Name = "DateTime", IsRequired = true)]
  25. public DateTime UtcDateTime
  26. {
  27. get { return utcDateTime; }
  28. set { utcDateTime = value; }
  29. }
  30. [DataMember(Name = "OffsetMinutes", IsRequired = true)]
  31. public short OffsetMinutes
  32. {
  33. get { return offsetMinutes; }
  34. set { offsetMinutes = value; }
  35. }
  36. public static DateTimeOffset GetDateTimeOffset(DateTimeOffsetAdapter value)
  37. {
  38. try
  39. {
  40. switch (value.UtcDateTime.Kind)
  41. {
  42. case DateTimeKind.Unspecified:
  43. return new DateTimeOffset(value.UtcDateTime, new TimeSpan(0, value.OffsetMinutes, 0));
  44. //DateTimeKind.Utc and DateTimeKind.Local
  45. //Read in deserialized DateTime portion of the DateTimeOffsetAdapter and convert DateTimeKind to Unspecified.
  46. //Apply ofset information read from OffsetMinutes portion of the DateTimeOffsetAdapter.
  47. //Return converted DateTimeoffset object.
  48. default:
  49. DateTimeOffset deserialized = new DateTimeOffset(value.UtcDateTime);
  50. return deserialized.ToOffset(new TimeSpan(0, value.OffsetMinutes, 0));
  51. }
  52. }
  53. catch (ArgumentException exception)
  54. {
  55. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlExceptionHelper.CreateConversionException(value.ToString(CultureInfo.InvariantCulture), "DateTimeOffset", exception));
  56. }
  57. }
  58. public static DateTimeOffsetAdapter GetDateTimeOffsetAdapter(DateTimeOffset value)
  59. {
  60. return new DateTimeOffsetAdapter(value.UtcDateTime, (short)value.Offset.TotalMinutes);
  61. }
  62. public string ToString(IFormatProvider provider)
  63. {
  64. return "DateTime: " + this.UtcDateTime + ", Offset: " + this.OffsetMinutes;
  65. }
  66. }
  67. }