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 值的数据。
不过,我强烈建议您尽快摆脱这种格式。
正如我在 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 值的数据。
不过,我强烈建议您尽快摆脱这种格式。