正如我在https://nodatime.org/2.0.x/userguide/migration-to-2上所读到的,对Instants数字格式的支持已被删除。
目前是否有办法创建一个NodaPatternConverter,它将转换为unix / ticks格式并返回?
SystemClock.Instance.GetCurrentInstant().ToString( "d", CultureInfo.InvariantCulture );
导致以下异常:
NodaTime.Text.InvalidPatternException : The standard format "d" is not valid for the NodaTime.Instant type.
基于Jon建议的解决方案我最终实施了:
public class InstantUnixTicksConverter : NodaConverterBase<Instant>
{
protected override Instant ReadJsonImpl( JsonReader reader, JsonSerializer serializer )
{
string text = reader.Value.ToString();
if ( !long.TryParse( text, out var ticks ) )
{
throw new InvalidNodaDataException( $"Value \'{text}\'cannot be parsed as numeric format {reader.TokenType}." );
}
return Instant.FromUnixTimeTicks( ticks );
}
protected override void WriteJsonImpl( JsonWriter writer, Instant value, JsonSerializer serializer )
{
writer.WriteValue( value.ToUnixTimeTicks() );
}
}
答案 0 :(得分:2)
好吧,您可以自己实施IPattern<T>
。您的解析器只需要使用long.Parse
,然后调用Instant.FromUnixTicks
。格式化程序只需要调用Instant.ToUnixTimeTicks
并格式化结果。理想情况下,在不变文化中做两者。
然后,您可以将该模式传递给NodaPatternConverter<T>
构造函数 - 或者直接实现JsonConverter
,说实话。
请注意,这只会为您提供与1.x匹配的刻度分辨率,但可能会丢失2.x值的数据。
我强烈建议您尽快摆脱这种格式。