我正在尽力弄清楚如何将 datetimeoffset 字符串持久保存到服务器,以便它正确绑定(bind)到 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));
有更好的方法吗?我可以发送整个日期而不仅仅是偏移量吗?
最佳答案
一些事情:
+04:00
是俄罗斯部分地区和中东一些地方使用的偏移量。从您博客上提到的位置来看,我认为您的意思是-04:00
,它用于美国东部夏令时(以及其他时间)。 (JavaScriptgetTimezoneOffset
方法与此相反。)+ ':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
。不要尝试自己构建它。
关于javascript - 将 DateTimeOffset 持久化到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44511468/