Javascript将计划日期从本地时区发送到服务器时间

Javascript将计划日期从本地时区发送到服务器时间,javascript,c#,.net,datetime,timezone,Javascript,C#,.net,Datetime,Timezone,我在夏威夷。从Angular开始,我想将太平洋标准时间(PST)发送到C#Net核心API。它将保存在数据库中,并保存在太平洋标准时间。(我没有创建架构,只是注意到了这点) 整个角度应用日期/时间以PST为参考 示例目标是将日期安排在太平洋标准时间下午4:30 我们今天学到了一个错误,如果我们发送日期“2021-03-17T16:30:00”,我们的应用程序将在夏威夷时区错误解释中创建新日期(“2021-03-17T16:30:00”)。然后C#可能做了正确的事情,并将任何时间转换为太平洋当地时

我在夏威夷。从Angular开始,我想将太平洋标准时间(PST)发送到C#Net核心API。它将保存在数据库中,并保存在太平洋标准时间。(我没有创建架构,只是注意到了这点)

整个角度应用日期/时间以PST为参考

示例目标是将日期安排在太平洋标准时间下午4:30

我们今天学到了一个错误,如果我们发送日期“2021-03-17T16:30:00”,我们的应用程序将在夏威夷时区错误解释中创建新日期(“2021-03-17T16:30:00”)。然后C#可能做了正确的事情,并将任何时间转换为太平洋当地时间
(TimeZoneInfo.ConvertTime(dateTime,TimeZoneInfo.FindSystemTimeZoneById(“America/Los#Angeles”)
。因此我们错误地转换为晚上7:30

我们的API请求数据类型是最新的。这个解决方案有效吗?但是,我觉得最后第四行不会考虑夏令时,或者会产生问题

constinputdate=“2021-03-17T16:30:00”;
const pstmome=moment.tz(输入日期“美国/洛杉矶”);
const clientTimeZoneName=Intl.DateTimeFormat().resolvedOptions().timeZone;
const clientMoment=pstnome.clone().tz(clientTimeZoneName);
console.log(新日期(clientMoment.format());//这将发送到API

如果我理解正确,问题是您当前在客户端的方法只是创建一个
Date
对象,如
newdate(“2021-03-17T16:30:00”)
,它将使用本地时区来确定您正在谈论的时间点。您希望它始终被解释为太平洋时间,但由于DST,您不知道要使用哪个偏移量

因此,您的问题的最终答案是-是的,您使用矩时区编写的代码确实会应用正确的偏移量。但是,它有点冗长。您实际上不需要做任何有关检测当前本地时区的事情。您只需使用以下内容构建
日期
对象即可:

moment.tz('2021-03-17T16:30:00','America/Los_Angeles')。toDate()
鉴于此,最好使用Luxon(除非您已经在项目中广泛使用了矩)。在Luxon中,这将是:

luxon.DateTime.fromso('2021-03-17T16:30:00',{zone:'America/Los_Angeles'}).toJSDate()
或者您也可以使用中的
zonedtimeoutc
功能

关键是,由于您正在构造一个
Date
对象,因此您总是通过网络发送它的一些字符串表示。您似乎正在使用
.toISOString()
序列化那些
Date
对象,这将发送UTC等效的
“2021-03-18T02:30:00.000Z”
。获得正确的UTC时间点是最重要的

在.NET代码中,如果您将该值接收到
DateTime
对象中,则其
Kind
属性将设置为
Utc
,因为字符串末尾的
Z
TimeZoneInfo.ConvertTime
将使用
Kind
属性确定转换的源时区nd您已经提供了目标时区为太平洋时间

一种更简单的方法是在客户端代码中不使用
Date
对象,而是通过线路发送预期的日期和时间,而不使用偏移量
“2021-03-17T16:30:00”
。在.NET代码中,
DateTime.Kind
将是
未指定的
。这样您就根本不会调用
TimeZoneInfo.ConvertTime
,因为您已经在所需的时区中拥有该值

备选方案:

对于TypeScript数据类型,可以使用字符串


将来,当完成并完全集成到ECMAScript中时,您可以使用
PlainDateTime

hi@RobG Intl.DateTimeFormat将其存储为字符串,我需要将其发送为C的日期类型#requestYou发布了javascript,所以我假设是javascript,很抱歉:-)您为什么要进行任何转换?如果您准确地将
“2021-03-17T16:30:00”
发送到服务器,则您已经拥有所需的数据。服务器端也一样。除非这里没有说明其他要求,否则不需要转换。@MattJohnson Pint好吧,API请求需要一个日期,而不是字符串,如果我有日期(“2021-03-17T16:30:00”),它将转换为上面描述的夏威夷时间作为字符串发送是最佳做法吗?太棒了,谢谢,如果我没有在Typescript客户端中使用Date对象,那么数据类型是什么?有绳子吗?谢谢