我有一个数据库,其中包含我想要在网络前端显示的设备的测量值。首先,我将设备列表与每个设备的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"鉴于柏林在夏令时的2小时抵消,这似乎是正确的。
我将此utc时间戳发送到我的ASP.NET Core后端。控制器如下所示:
[HttpGet]
public IEnumerable<TimestampedValue> GetValues(int id, DateTime startTimestamp)
{
...
}
问题是startTimestamp
是2017-08-01 00:00:00,当调用控制器并且其Kind
属性设置为Local时。我原本期望它是相同的UTC时间戳。
知道我做错了什么吗?我认为moment.js正确地完成了它的工作,所以这一定是服务器端的一个问题。如果我没记错的话,反序列化是由JSON.net完成的,但我不明白为什么它不遵守时间字符串末尾的Z.