【问题标题】:Persisting DateTimeOffset to server将 DateTimeOffset 持久化到服务器
【发布时间】:2017-06-17 06:51:43
【问题描述】:

我正在尽力弄清楚如何将 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));

有没有更好的方法来做到这一点?我可以发送整个日期而不是仅发送偏移量吗?

【问题讨论】:

  • new Date().getTimezoneOffset() / 60 如何解析为+4:00
  • 它是一个运行在客户端的JavaScript函数,它也是以'+'为前缀的
  • 您应该发布您正在使用的实际代码,OP 中的示例并没有按照您所说的那样做。它将返回一个像“1497327412934+-10”这样的字符串,大多数解析器都无法理解。如果要生成带有主机偏移量的 ISO 8601 日期和时间字符串,请使用 moment().format(),它默认使用 ISO 8601 格式并返回类似“2017-06-12T22:27:00+04:00”的字符串.
  • 对不起,我已经更新了...我最终改为只捕获偏移量并将其发送到服务器,这就是错误的原因.. ISO 8601 看起来像我想要的...但这看起来就像一个日期时间格式.. 是否有可能以 ISO 8601 格式将该日期作为 UTC 获取?
  • 内置的toISOString 这样做:new Date().toISOString() 按规范使用 UTC。

标签: javascript c# nancy datetimeoffset


【解决方案1】:

一些事情:

  • +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)/。如您所见,时间戳部分是基于 UTC 的 Unix 时间的毫秒分辨率版本。偏移量尚未应用,因此是无关的。这种格式现在被认为已弃用,所以请不要这样做。

  • 您似乎在客户端使用 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。不要尝试自己构建它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2017-02-26
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多