IsoDateTimeConverter
Converts a  DateTime to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z").
            
                using Newtonsoft.Json.Utilities;
using System;
using System.Globalization;
using System.Runtime.CompilerServices;
namespace Newtonsoft.Json.Converters
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    public class IsoDateTimeConverter : DateTimeConverterBase
    {
        private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK";
        private DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind;
        [System.Runtime.CompilerServices.Nullable(2)]
        private string _dateTimeFormat;
        [System.Runtime.CompilerServices.Nullable(2)]
        private CultureInfo _culture;
        public DateTimeStyles DateTimeStyles {
            get {
                return _dateTimeStyles;
            }
            set {
                _dateTimeStyles = value;
            }
        }
        [System.Runtime.CompilerServices.Nullable(2)]
        public string DateTimeFormat {
            [System.Runtime.CompilerServices.NullableContext(2)]
            get {
                return _dateTimeFormat ?? string.Empty;
            }
            [System.Runtime.CompilerServices.NullableContext(2)]
            set {
                _dateTimeFormat = (StringUtils.IsNullOrEmpty(value) ? null : value);
            }
        }
        public CultureInfo Culture {
            get {
                return _culture ?? CultureInfo.CurrentCulture;
            }
            set {
                _culture = value;
            }
        }
        public override void WriteJson(JsonWriter writer, [System.Runtime.CompilerServices.Nullable(2)] 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);
        }
        [return: System.Runtime.CompilerServices.Nullable(2)]
        public override object ReadJson(JsonReader reader, Type objectType, [System.Runtime.CompilerServices.Nullable(2)] object existingValue, JsonSerializer serializer)
        {
            bool flag = ReflectionUtils.IsNullableType(objectType);
            if (reader.TokenType == JsonToken.Null) {
                if (!flag)
                    throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType));
                return null;
            }
            Type left = flag ? Nullable.GetUnderlyingType(objectType) : objectType;
            if (reader.TokenType == JsonToken.Date) {
                if (left == typeof(DateTimeOffset)) {
                    if (!(reader.Value is DateTimeOffset))
                        return new DateTimeOffset((DateTime)reader.Value);
                    return reader.Value;
                }
                object value = reader.Value;
                if (value is DateTimeOffset)
                    return ((DateTimeOffset)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 (StringUtils.IsNullOrEmpty(text) & flag)
                return null;
            if (left == typeof(DateTimeOffset)) {
                if (!StringUtils.IsNullOrEmpty(_dateTimeFormat))
                    return DateTimeOffset.ParseExact(text, _dateTimeFormat, Culture, _dateTimeStyles);
                return DateTimeOffset.Parse(text, Culture, _dateTimeStyles);
            }
            if (!StringUtils.IsNullOrEmpty(_dateTimeFormat))
                return DateTime.ParseExact(text, _dateTimeFormat, Culture, _dateTimeStyles);
            return DateTime.Parse(text, Culture, _dateTimeStyles);
        }
    }
}