从nodatime的时刻开始将时区传递给web api

Spa*_*y74 3 javascript c# asp.net-web-api nodatime

我即将疯狂处理日期时间问题和网络.

我在中央时区托管了一个Web服务器.当东部时区的客户使用我的应用程序尝试和安排某一天的项目时,他们会传递(例如)2015年3月14日的值.当我们将代码传递回我们发送到web api的模型时,我们坚持使用类似下面的代码.

moment.utc($("#mydatepicker").val).hour(0).minute(0).second(0)).toISOString();
Run Code Online (Sandbox Code Playgroud)

这会产生如下字符串:

2015-03-14T04:00:00.000Z
Run Code Online (Sandbox Code Playgroud)

在web api中将项目转换回服务器时,它将转换为

3/13/2015 11:00:00 PM
Run Code Online (Sandbox Code Playgroud)

逻辑然后剥离时间,你可以看到从这里发生的事情.由于我剥离了时间,现在是前一天,这是持久存储到数据库的值.

我需要知道从某个时刻发送值的一些方法,最好是作为客户端时区的ZonedDateTime进入web api.然后,我可以将其转换为UTC以保持数据库中的持久性.

我已经看到了使用NodaTime.Serialization.JsonNet的事情,但我不清楚如何将它与Moment一起使用并在web api/ajax中来回传递.

Mat*_*int 7

我需要知道从某个时刻发送值的一些方法,最好是作为客户端时区的ZonedDateTime进入web api.然后,我可以将其转换为UTC以保持数据库中的持久性.

如果这就是你想要的,那么:

  • 在你的moment.js代码中,使用.format()而不是.toISOString(),它仍将为您提供ISO8601字符串,但将包括本地偏移量而不是将其设置为UTC.

  • 在您的ASP.Net代码中,将您的值定义为DateTimeOffset(或noda OffsetDateTime)而不是a DateTime.

但是,我认为这不是你想要的.在日期和时间方面,背景非常重要.在这里,你说你是从日期选择器中选择一个日期.当你这样做时 - 用户选择的时间是什么时候?在大多数情况下,他们没有选择时间 - 他们只是选择约会.但由于JavaScriptDate对象实际上是"日期+时间"对象,因此它将午夜指定为默认时间.在这方面,时刻并不好.

实际上,当您只是谈论日历日期时,转换为UTC没有逻辑意义.您的字符串值大概应在整个导线发送应该只是一个整体的日期,如"2015-03-14".我的猜测是,无论如何,这就是你的开始.如果没有,那就去做moment.utc(yourvalue).format("YYYY-MM-DD")吧.(在这里使用UTC只是一种避免当地时区问题的方法,例如春天前天在巴西不存在的午夜.)

这对应LocalDate于.NET代码中的NodaTime 类型.如果您没有使用Noda Time,您可以将类型定义为a DateTime并忽略时间部分.在您的数据库中,如果有可用的日期类型,则使用它.例如,SQL Server有一个date类型.

我还鼓励你观看我的Pluralsight课程,日期和时间基础 - 其中涵盖了许多这些问题.

关于NodaTime.Serialization.JsonNet在WebAPI中使用(所以你可以LocalDate直接使用),在你的WebApiConfig.cs文件中,将它连接起来,如下所示:

config.Formatters.JsonFormatter.SerializerSettings
                 .ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
Run Code Online (Sandbox Code Playgroud)

那它应该工作.