NodaPatternConverter for Instant with 2.x.x中的数字(unix)格式

时间:2017-10-23 23:11:58

标签: nodatime

正如我在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() );
    }
}

1 个答案:

答案 0 :(得分:2)

好吧,您可以自己实施IPattern<T>。您的解析器只需要使用long.Parse,然后调用Instant.FromUnixTicks。格式化程序只需要调用Instant.ToUnixTimeTicks并格式化结果。理想情况下,在不变文化中做两者。

然后,您可以将该模式传递给NodaPatternConverter<T>构造函数 - 或者直接实现JsonConverter,说实话。

请注意,这只会为您提供与1.x匹配的刻度分辨率,但可能会丢失2.x值的数据。

我强烈建议您尽快摆脱这种格式。