private void TestParse(DateTimeOffset expectedResult, string dateTimeString) { var result = FlexibleIso8601DateTimeParser.TryParse(dateTimeString); Assert.NotNull(result); Assert.Equal(expectedResult.Offset, result.Value.Offset); Assert.Equal(expectedResult.UtcDateTime.Year, result.Value.UtcDateTime.Year); Assert.Equal(expectedResult.UtcDateTime.Month, result.Value.UtcDateTime.Month); Assert.Equal(expectedResult.UtcDateTime.Day, result.Value.UtcDateTime.Day); Assert.Equal(expectedResult.UtcDateTime.Hour, result.Value.UtcDateTime.Hour); Assert.Equal(expectedResult.UtcDateTime.Minute, result.Value.UtcDateTime.Minute); Assert.Equal(expectedResult.UtcDateTime.Second, result.Value.UtcDateTime.Second); Assert.True(Math.Abs(expectedResult.UtcDateTime.Millisecond - result.Value.UtcDateTime.Millisecond) <= 1); }
/// <inheritdoc/> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var isNullable = objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeof(Nullable <>); var actualType = isNullable ? Nullable.GetUnderlyingType(objectType) : objectType; if (reader.TokenType == JsonToken.Null) { if (isNullable) { return(null); } throw new ParseException("Cannot convert JSON null value to {0}.", objectType); } if (reader.TokenType == JsonToken.String) { var dateTimeOffset = FlexibleIso8601DateTimeParser.TryParse(reader.Value.ToString()); if (dateTimeOffset == null) { return(isNullable? Activator.CreateInstance(actualType): null); } if (actualType == typeof(DateTimeOffset)) { return(dateTimeOffset.Value); } if (actualType == typeof(DateTime)) { return(dateTimeOffset.Value.UtcDateTime); } throw new ParseException("Unexpected target type {0}.", actualType); } throw new ParseException("Unexpected token parsing date. Expected String, got {0}.", reader.TokenType); }