将 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。不要尝试自己构建它。