将 DateTimeOffset 持久化到服务器
Persisting DateTimeOffset to server
我正在尽力找出如何将 datetimeoffset 字符串持久保存到服务器,以便它正确绑定到 DateTimeOffset 属性。
我试过使用这样的东西:
moment.utc().format() + ' +' + new Date().getTimezoneOffset() / 60 + ':00';
这显示为 6/12/2017 22:27 +4:00,我将其作为字符串发送到服务器,但似乎每次都无法解析为 DateTimeOffset 对象。
目前我正在为我的 Web api 框架使用 Nancy,但我想知道 Web API 也有同样的事情。
目前我只是发回偏移量并像这样设置 DateTimeOffset 属性:
dto.CommentDate = new DateTimeOffset(DateTime.UtcNow).ToOffset(new TimeSpan(dto.Offset, 0, 0));
有更好的方法吗?我可以发送整个日期而不仅仅是偏移量吗?
几件事:
+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
class 之类的东西。上一个示例的对应值为 /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
。不要尝试自己构建它。
我正在尽力找出如何将 datetimeoffset 字符串持久保存到服务器,以便它正确绑定到 DateTimeOffset 属性。
我试过使用这样的东西:
moment.utc().format() + ' +' + new Date().getTimezoneOffset() / 60 + ':00';
这显示为 6/12/2017 22:27 +4:00,我将其作为字符串发送到服务器,但似乎每次都无法解析为 DateTimeOffset 对象。
目前我正在为我的 Web api 框架使用 Nancy,但我想知道 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
class 之类的东西。上一个示例的对应值为/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
。不要尝试自己构建它。