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

NodaPatternConverter for Instant with numeric (unix) format in 2.x.x

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

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

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

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

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