2017-10-23 8 views
1

https://nodatime.org/2.0.x/userguide/migration-to-2で読むことができるように、インスタントの数値書式設定のサポートは削除されました。2.x.xの数値(Unix)形式のInstantのためのNodaPatternConverter

現在、UNIX /ティック形式に変換して戻すNodaPatternConverterを作成する方法はありますか?次の例外で

SystemClock.Instance.GetCurrentInstant().ToString("d", CultureInfo.InvariantCulture); 

結果:

NodaTime.Text.InvalidPatternException : The standard format "d" is not valid for the NodaTime.Instant type. 

私が実装し終わってきたジョンの提案に基づくソリューション:

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()); 
    } 
} 

答えて

2

さて、あなたはIPattern<T>を自分で実装することができます。あなたのパーサーはlong.Parseを使用し、次にInstant.FromUnixTicksと呼ぶだけです。フォーマッタは、Instant.ToUnixTimeTicksを呼び出し、結果をフォーマットするだけです。理想的には、不変の文化の中でそれらの両方を行う。

そのパターンをNodaPatternConverter<T>コンストラクタに渡すことができます。正直言って、JsonConverterを直接実装するだけです。

これは、1.xと一致するが、2.x値のデータが失われる可能性があるティック解像度を与えることに注意してください。

できるだけ早くこのフォーマットから離れることを強くお勧めします。

関連する問題