我正在尽力弄清楚如何将datetimeoffset字符串保存到服务器,以便它正确绑定到DateTimeOffset属性。
我尝试过这样的事情:
moment.utc().format() + ' +' + new Date().getTimezoneOffset() / 60 + ':00';
这显示为6/12/2017 22:27 +4:00,我将其作为字符串发送到服务器,但似乎每次都无法解析为DateTimeOffset对象。
我目前正在使用Nancy作为我的web api框架,但我也想知道Web API也是如此。
目前我只是发回偏移并设置DateTimeOffset属性,如下所示:
dto.CommentDate = new DateTimeOffset(DateTime.UtcNow).ToOffset(new TimeSpan(dto.Offset, 0, 0));
有更好的方法吗?我可以发送整个日期而不仅仅是偏移吗?
答案 0 :(得分:5)
一些事情:
+04:00
是俄罗斯部分地区和中东地区的一些地方。从您博客上提到的位置,我认为您的意思是-04:00
,用于美国的东部夏令时(以及其他)。 (在此方面,JavaScript getTimezoneOffset
方法被颠倒了。)
+ ':00'
假设所有时区偏移均按整个小时计算。实际上,很多是:30
,有些是:45
。
在DateTimeOffset
中,DateTime
部分始终是本地时间,而不是UTC时间。换句话说,已经应用了偏移量。
例如,如果美国东部时区的当地时间为2017-06-16 12:00:00
,那么我们将其表示为2017-06-16T12:00:00-04:00
(采用ISO 8601格式)。相应的UTC时间将表示为2017-06-16T16:00:00Z
。
ISO 8601格式不允许发送UTC时间加上本地偏移量。我所知道的唯一使用该约定的格式是较旧的"ASP.NET JSON Date Format",它来自.NET中的JavaScriptSerializer
类。前一个示例的相应值为/Date(1497628800000-0400)/
。如您所见,时间戳部分是Unix时间的毫秒分辨率版本,它基于UTC。偏移量尚未应用,因此无关紧要。这种格式现在被弃用了,所以请不要这样做。
您似乎在客户端使用moment.js。这可以轻松生成您需要发送的字符串。
// get the current time, as an ISO 8601 string, with whole-second resolution
moment().format() // "2017-06-16T12:00:00-04:00"
// or, with millisecond resolution
moment().format('YYYY-MM-DD[T]HH:mm:ss.SSSZ') // "2017-06-16T12:00:00.000-04:00"
在服务器端,只需将您的媒体资源公开为DateTimeOffset
即可。不要试图自己构建它。