使用
CustomInstantPattern
是一个很好的方法,但我会避免使用任何.NET日期/时间类型。
相反,我会用两个
OffsetDateTimePattern
实例,一个带冒号,一个不带冒号,并将它们与
CompositePattern
Instant
当你需要的时候。
以下是完整的示例代码:
using Newtonsoft.Json;
using NodaTime;
using NodaTime.Serialization.JsonNet;
using NodaTime.Text;
using System;
using System.Text;
class CustomInstantPattern : IPattern<Instant>
{
private readonly IPattern<OffsetDateTime> offsetDateTimePattern;
public CustomInstantPattern()
{
var patternWithColon = OffsetDateTimePattern.CreateWithInvariantCulture("uuuu'-'MM'-'dd'T'HH':'mm':'ss;FFFFFFFFFo<G>");
var patternWithoutColon = OffsetDateTimePattern.CreateWithInvariantCulture("uuuu'-'MM'-'dd'T'HH':'mm':'ss;FFFFFFFFFo<I>");
offsetDateTimePattern = new CompositePatternBuilder<OffsetDateTime>()
{
{ patternWithColon, _ => true },
{ patternWithoutColon, _ => true }
}.Build();
}
public StringBuilder AppendFormat(Instant value, StringBuilder builder) =>
offsetDateTimePattern.AppendFormat(value.WithOffset(Offset.Zero), builder);
public string Format(Instant value) =>
offsetDateTimePattern.Format(value.WithOffset(Offset.Zero));
public ParseResult<Instant> Parse(string text) =>
offsetDateTimePattern.Parse(text).Convert(odt => odt.ToInstant());
}
class Entity
{
public Instant I { get; set; }
}
class Program
{
static void Main(string[] args)
{
var settings = new JsonSerializerSettings
{
DateParseHandling = DateParseHandling.None,
Converters = { new NodaPatternConverter<Instant>(new CustomInstantPattern()) }
};
string json = " { \"i\": \"2018-10-25T18:34:11.911+0000\" }";
Entity entity = JsonConvert.DeserializeObject<Entity>(json, settings);
Console.WriteLine(entity.I);
json = " { \"i\": \"2018-10-25T18:34:11.911+00:00\" }";
entity = JsonConvert.DeserializeObject<Entity>(json, settings);
Console.WriteLine(entity.I);
}
}
OffsetDateTime
模式,其中一个是我们没有一个标准的“扩展ISO”模式,这很烦人。当我可以的时候,我会尽量解决这两个问题。)