using System; using System.Globalization; using DPumpHydr.WinFrmUI.WenSkin.Json.Utilities; namespace DPumpHydr.WinFrmUI.WenSkin.Json.Converters { /// /// Converts a to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z). /// public class IsoDateTimeConverter : DateTimeConverterBase { private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; private DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind; private string _dateTimeFormat; private CultureInfo _culture; /// /// Gets or sets the date time styles used when converting a date to and from JSON. /// /// The date time styles used when converting a date to and from JSON. public DateTimeStyles DateTimeStyles { get { return _dateTimeStyles; } set { _dateTimeStyles = value; } } /// /// Gets or sets the date time format used when converting a date to and from JSON. /// /// The date time format used when converting a date to and from JSON. public string DateTimeFormat { get { return _dateTimeFormat ?? string.Empty; } set { _dateTimeFormat = (string.IsNullOrEmpty(value) ? null : value); } } /// /// Gets or sets the culture used when converting a date to and from JSON. /// /// The culture used when converting a date to and from JSON. public CultureInfo Culture { get { return _culture ?? CultureInfo.CurrentCulture; } set { _culture = value; } } /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { string value2; if (value is DateTime) { DateTime dateTime = (DateTime)value; if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) { dateTime = dateTime.ToUniversalTime(); } value2 = dateTime.ToString(_dateTimeFormat ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK", Culture); } else { if (!(value is DateTimeOffset)) { throw new JsonSerializationException("Unexpected value when converting date. Expected DateTime or DateTimeOffset, got {0}.".FormatWith(CultureInfo.InvariantCulture, ReflectionUtils.GetObjectType(value))); } DateTimeOffset dateTimeOffset = (DateTimeOffset)value; if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) { dateTimeOffset = dateTimeOffset.ToUniversalTime(); } value2 = dateTimeOffset.ToString(_dateTimeFormat ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK", Culture); } writer.WriteValue(value2); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { bool flag = ReflectionUtils.IsNullableType(objectType); Type type = (flag ? Nullable.GetUnderlyingType(objectType) : objectType); if (reader.TokenType == JsonToken.Null) { if (!ReflectionUtils.IsNullableType(objectType)) { throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); } return null; } if (reader.TokenType == JsonToken.Date) { if (type == typeof(DateTimeOffset)) { if (!(reader.Value is DateTimeOffset)) { return new DateTimeOffset((DateTime)reader.Value); } return reader.Value; } if (reader.Value is DateTimeOffset) { return ((DateTimeOffset)reader.Value).DateTime; } return reader.Value; } if (reader.TokenType != JsonToken.String) { throw JsonSerializationException.Create(reader, "Unexpected token parsing date. Expected String, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } string text = reader.Value.ToString(); if (string.IsNullOrEmpty(text) && flag) { return null; } if (type == typeof(DateTimeOffset)) { if (!string.IsNullOrEmpty(_dateTimeFormat)) { return DateTimeOffset.ParseExact(text, _dateTimeFormat, Culture, _dateTimeStyles); } return DateTimeOffset.Parse(text, Culture, _dateTimeStyles); } if (!string.IsNullOrEmpty(_dateTimeFormat)) { return DateTime.ParseExact(text, _dateTimeFormat, Culture, _dateTimeStyles); } return DateTime.Parse(text, Culture, _dateTimeStyles); } } }