【问题标题】:Simplest way to convert UNIX Timestamp to DateTime in ASP.NET在 ASP.NET 中将 UNIX 时间戳转换为 DateTime 的最简单方法
【发布时间】:2019-12-01 06:34:38
【问题描述】:

我有以下模型代码:

public class Sensor
{
    public long Id { get; set; }
    [Required]
    public string Tag { get; set; }
    public DateTime Timestamp { get; set; }
    public string Status { get; set; }
    public int Valor { get; set; }
}

我正在通过 WebAPI 控制器通过 POST 方法接收此信息。

这是 POST 方法的签名:

public async Task<ActionResult<Sensor>> PostSensor(Sensor sensor)

它接收像这个例子这样的值:

{
    "tag": "mytag",
    "Timestamp": "1575179924",
    "valor": "3000"
}

我的问题是由于控制器的签名,它尝试验证时间戳,但由于 UNIX 时间戳不是 DateTime 时间戳而失败。

我想在这个方法中转换它,但这需要禁用整个控制器的验证。

我尝试创建一个 JSON 转换器,但总是无法转换。

public class UnixEpochTimeToDateTimeConverter: Newtonsoft.Json.JsonConverter
{
    public override bool CanWrite => false;

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
        if (!reader.Path.ToLower().Contains("time")) return null;
        var parsed = long.TryParse(reader.Value.ToString(), out var unixTimeStamp);
        if(!parsed){ return null; }
        var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        var timeSpan = TimeSpan.FromSeconds(unixTimeStamp);
        var localDateTime = epoch.Add(timeSpan).ToLocalTime();

        return localDateTime;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }
}

(我收到此错误:无法将 JSON 值转换为 System.DateTime。路径:$.Timestamp

有解决办法吗?也许另一种转换方式? (我真的不知道我做错了什么)

【问题讨论】:

  • 备注:你知道DateTimeOffset.FromUnixTimeSeconds吗?
  • 是的,我在谷歌搜索时看到了这个方法的一些实现,但由于某种原因它仍然失败。作为一种解决方法,我创建了一个“UnixSensor”模型类,它接收标签、时间戳和值。我禁用了自动验证并手动进行了转换(将 UnixSensor 的数据转换并传输到 Sensor 的模型,然后保存在数据库/回复客户端)。不过,这听起来像一个非常丑陋的方法,不确定它是否是唯一的方法。
  • 当然这并不能解决您的问题,只是说明这将是您代码中 DateTime/TimeSpan 数学的内置替代方案。
  • this 不是已经在做你想做的事了吗?
  • 我也尝试使用这个转换器作为时间戳的注释,它给了我和我写的转换器一样的错误。

标签: c# asp.net .net


【解决方案1】:

不要对抗格式,只允许Timestamp 成为long。您没有理由不能通过调用 Sensor 对象上的属性将时间戳转换为您需要的任何格式。

public class Sensor
{
    public long Id { get; set; }

    [Required]
    public string Tag { get; set; }

    public long Timestamp { get; set; }

    public DateTime TimestampDt
    { 
        get
        {
            return DateTimeOffset.FromUnixTimeSeconds(Timestamp).UtcDateTime;
        }
    }

    public string Status { get; set; }

    public int Valor { get; set; }
}

【讨论】:

  • 这似乎是一个非常优雅和简单的解决方案。它在这里工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 2015-04-13
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多