我即将疯狂处理日期时间问题和网络。
我在中央时区托管了一个网络服务器。当东部时区的客户使用我的应用程序尝试和安排某一天的项目时,他们会传递(例如)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上来回传递。
答案 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吗?