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

时间:2015-05-12 17:07:26

标签: javascript c# asp.net-web-api nodatime

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

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

moment.utc($("#mydatepicker").val).hour(0).minute(0).second(0)).toISOString();

这会产生如下字符串:

2015-03-14T04:00:00.000Z

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

3/13/2015 11:00:00 PM

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

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

我已经看过使用NodaTime.Serialization.JsonNet的事情,但我不知道如何将它与Moment一起使用并在web api / ajax上来回传递。

2 个答案:

答案 0 :(得分:7)

  

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

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

  • 在你的moment.js代码中,使用.format()代替.toISOString(),它仍然会为您提供ISO8601字符串,但会包含本地偏移,而不是将其设置为UTC。< / p>

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

然而 ,我不认为这真的是你想要的。说到日期和时间, context 非常重要。在这里,你说你是从日期选择器中选择一个日期。当你这样做时 - 用户选择的时间是什么时候?在大多数情况下,他们选择时间 - 他们只是选择约会。但是因为JavaScript Date对象实际上是&#34;日期+时间&#34;对象,它将午夜指定为默认时间。在这方面,时刻并不好。

实际上,当您谈论日历日期时,转换为UTC并不符合逻辑。您可能应该通过网络发送的字符串值应该只是整个日期,如"2015-03-14"中所示。我的猜测是,无论如何,这就是你的开始。如果没有,那么请moment.utc(yourvalue).format("YYYY-MM-DD")获取它。 (在这里使用UTC只是一种避免当地时区问题的方法,例如在春季前一天巴西不存在午夜。)

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

我还鼓励您观看我的Pluralsight课程Date and Time Fundamentals - 其中涵盖了许多这些问题。

关于在WebAPI中使用NodaTime.Serialization.JsonNet(以便您可以直接使用LocalDate),在WebApiConfig.cs文件中,将其连接起来:

config.Formatters.JsonFormatter.SerializerSettings
                 .ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);

然后它应该工作。

答案 1 :(得分:1)

我首先将所有日期和时间作为UTC时间发送到服务器。如果您只存储UTC时间,那么您应该能够显示在客户端安排某些内容的正确时间。

当你在客户端创建你的时刻时,你先将它运行.toDate()然后再发送到服务器端吗?你在服务器端运行什么代码?它是.Net WebApi吗?