将DateTimeOffset保留到服务器

时间:2017-06-13 02:30:39

标签: javascript c# nancy datetimeoffset

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

有更好的方法吗?我可以发送整个日期而不仅仅是偏移吗?

1 个答案:

答案 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即可。不要试图自己构建它。

相关问题