提问者:小点点

是否更改长类型的Unix时间戳? 在使用System.Text.JSON将对象序列化为JSON时,将对象序列化为一个漂亮的日期


有时,我需要发送一个简单的电子邮件给客户与数据,我们存储在对象。 然而,对象的日期时间存储为long? Unix时间戳。 显然,这种格式对于普通人来说是不可读的,因此必须将其转换为用户可以理解的格式。 我不能将时间戳的类型从long更改为DateTime,因为这会在许多地方破坏代码。 到目前为止,我可以想出一个解决方案,它将自定义转换器用于JSON序列化程序。 但是,我不想打破反序列化过程的逻辑。 我很想省略在转换器中实现读函数,但如果这样做,就会出现错误。 我要做的只是返回读者的值? 我想?

有人能说这段代码是否不会破坏JSONSerializer的反序列化过程吗? 否则就很糟糕了。

或者,在JSON文件中,是否有更好的解决方案可以将长数字替换为漂亮的日期?

using System;
using System.Text.Json;
using System.Text.Json.Serialization;

public class EpochToDateJSONSerializeConverter : JsonConverter<long?>
    {
        public override long? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if(reader.TryGetInt64(out long currentValue))
            {
                return currentValue;
            }
            return null;
        }

        public override void Write(Utf8JsonWriter writer, long? value, JsonSerializerOptions options)
        {
            if (value.HasValue)
            {
                long unixTimeStamp = value.Value;
                DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
                dtDateTime = dtDateTime.AddMilliseconds(unixTimeStamp).ToLocalTime();
                writer.WriteStringValue(dtDateTime.ToString());
            }
            else
            {
                writer.WriteStringValue("null");
            }

        }
    }

我一直在一个简单的汽车类上测试转换器。 重要的是只选长? 属性更改为“漂亮的日期”,其他属性保持不变。

public class Car
    {
        public string Name { get; set; }
        public long? Kilometrage { get; set; }
        [JsonConverter(typeof(EpochToDateJSONSerializeConverter))]
        public long? ProductionDate { get; set; }
    }

在Main中:

    Car car = new Car() { Name = "MyCar", Kilometrage = 69, ProductionDate = 1589277616910};
    Console.WriteLine(JsonSerializer.Serialize(car));

共1个答案

匿名用户

如果您不介意DateTimeOffset而不是DateTime,则始终存在DateTimeOffset.FromUnixTimeseconds及其反向.ToNixTimeseconds