编程语言
首页 > 编程语言> > javascript – 从nodatime的时刻开始将时区传递给web api

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

作者:互联网

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

我在中央时区托管了一个Web服务器.当东部时区的客户使用我的应用程序尝试和安排某一天的项目时,他们会传递(例如)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中来回传递.

解决方法:

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(或noda OffsetDateTime)而不是DateTime.

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

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

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

我也鼓励你观看我的Pluralsight课程,Date and Time Fundamentals – 其中涵盖了许多这些问题.

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

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

那它应该工作.

标签:javascript,c-2,asp-net-web-api,nodatime
来源: https://codeday.me/bug/20190725/1527940.html