gpt4 book ai didi

asp.net-core - 使用 moment.js 将 UTC 时间戳发送到 ASP.NET Core Controller

转载 作者:行者123 更新时间:2023-12-03 14:39:44 24 4
gpt4 key购买 nike

我有一个数据库,其中包含我想在 Web 前端显示的设备的测量值。首先,我将设备列表连同每个设备的 IANA 时区说明符一起发送到前端。

我希望所有时间戳都转换为 UTC。用户在前端以设备本地时间选择一个时间范围。我使用 moment.js 将这些时间戳转换为具有设备已知时区的 UTC,如下所示:

var startTimestamp = new Date(2017, 7, 1); //some local timestamp (zero-based month!)

var m = moment.tz(startTimestamp, "Europe/Berlin");

var utc = moment.utc(m).format();

utc 现在是“2017-07-31T22:00:00Z”,考虑到柏林在 DST 中的 2 小时偏移,这似乎是正确的。

我将此 utc 时间戳发送到我的 ASP.NET Core 后端。 Controller 看起来像这样:

[HttpGet]
public IEnumerable<TimestampedValue> GetValues(int id, DateTime startTimestamp)
{
...
}

问题是当调用 Controller 并且其 Kind 属性设置为 Local 时,startTimestamp 为 2017-08-01 00:00:00。我原以为它是相同的 UTC 时间戳。

知道我做错了什么吗?我认为 moment.js 正在正确地完成它的工作,所以这一定是服务器端的问题。如果我没记错的话,反序列化是由 JSON.net 完成的,但我不明白为什么它不遵守时间字符串末尾的 Z。

最佳答案

在@dbc 向我指出 GET 和 POST 请求之间的不同行为后,我得出了这个结论:

由于我的请求使用的是 GET 方法并且查询字符串不是 JSON,因此问题不涉及 JSON.net,它是默认的 .NET Core DateTimeConverter 进行转换。 Moment.js 正确地将时间戳转换为 UTC 字符串,我使用浏览器开发人员工具进行了检查。

DateTimeConverter 的代码可以在这里找到: https://github.com/dotnet/corefx/blob/312736914d4e98c2948778bacac029aa831dd6b5/src/System.ComponentModel.TypeConverter/src/System/ComponentModel/DateTimeConverter.cs

从那里可以看出,转换器使用 DateTime.Parse。可以在一个简单的测试项目中测试 DateTime.Parse 不尊重 Z 后缀。这也在这里讨论DateTimeConverter converting from UTC string .

我认为至少会有四种解决方案

1) 编写自定义模型 Binder 。这些SO各展示一部分
Custom DateTime model binder in ASP.NET Core 1 (RTM)
https://dotnetcoretutorials.com/2016/12/28/custom-model-binders-asp-net-core/

2) 编写一个自定义类型转换器来覆盖默认的 DateTime 转换器并检查是否有尾随 Z。如果有,请将 DateTime.Parse 与 DateTimeStyles.AdjustToUniversal 一起使用。否则退回到默认实现。我喜欢这个解决方案,但我目前不知道如何替换默认的 DateTimeConverter。

3) 用 DateTimeOffset 替换 Controller 中所有相关的 DateTime 参数。 DateTimeOffset 似乎可以正确转换 UTC 字符串。

4) 使用 POST 而不是请求正文中带有 JSON 的 GET 请求。 JSON.net 似乎可以正确转换 UTC 字符串。

目前我的首选解决方案是 3 和 4 的混合,具体取决于上下文。

关于asp.net-core - 使用 moment.js 将 UTC 时间戳发送到 ASP.NET Core Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45602736/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com