我快要疯狂处理日期时间问题和网络了。
我在中央时区托管了一个网络服务器。当东部时区的客户尝试使用我的应用程序在给定的一天安排一个项目时,他们传递了(例如)3/14/2015 的值。当我们将代码传回我们的模型(发送到 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
然后逻辑剥离时间,您可以从这里看到发生了什么。由于我去掉了时间,现在是前一天,这是保存到数据库中的值。
我需要知道一些方法来从时刻开始将值发送到 web api 中,最好是作为客户端时区中的 ZonedDateTime。然后我可以将其转换为 UTC 以在数据库中持久保存。
我看过有关使用 NodaTime.Serialization.JsonNet 的内容,但我不清楚如何将它与 Moment 一起使用并在 Web api/ajax 之间来回传递。
最佳答案
I need to know some way to send a value from moment, into the web api preferrably as a ZonedDateTime in the client's time zone. I can then convert it to UTC for persistance in the DB.
如果这是你想要的,那么:
在你的 moment.js 代码中,使用
.format()
而不是.toISOString()
,它仍然会给你一个 ISO8601 字符串,但会包含本地偏移量而不是将其设置为 UTC。在您的 ASP.Net 代码中,将您的值定义为
DateTimeOffset
(或 nodaOffsetDateTime
)而不是DateTime
.
但是,我认为这并不是您真正想要的。对于日期和时间,上下文 非常重要。在这里,你说你正在从日期选择器中选择一个日期。当你这样做时 - 用户选择什么时间?在大多数情况下,他们没有选择时间——他们只是在选择日期。但由于 JavaScript Date
对象实际上是一个“日期 + 时间”对象,它指定午夜作为默认时间。在这方面,Moment 也好不到哪儿去。
真的,当您只是谈论日历日期时,转换为 UTC 没有逻辑意义。您可能应该通过网络发送的字符串值应该只是一个完整的日期,如“2015-03-14”
。我的猜测是,无论如何,这就是您要开始的。如果没有,则执行 moment.utc(yourvalue).format("YYYY-MM-DD")
获取它。 (此处使用 UTC 只是避免本地时区问题的一种方式,例如在 Spring 到来的巴西不存在午夜。)
这对应于 .NET 代码中的 NodaTime LocalDate
类型。如果您不使用 Noda Time,您可以将类型定义为 DateTime
并忽略时间部分。在您的数据库中,如果有可用的日期类型,则使用它。例如,SQL Server 有一个 date
类型。
我还鼓励您观看我的 Pluralsight 类(class),Date and Time Fundamentals - 其中涵盖了其中的许多问题。
关于在 WebAPI 中使用 NodaTime.Serialization.JsonNet
(因此您可以直接使用 LocalDate
),在您的 WebApiConfig.cs
文件中,连线像这样:
config.Formatters.JsonFormatter.SerializerSettings
.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
那么它应该就可以正常工作了。
关于javascript - 使用 nodatime 从时刻开始将时区传递到 web api 调用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30197330/