如何将日期从打字稿转换为c#并以正确的时区返回?

时间:2019-07-07 09:22:11

标签: c# typescript timezone

我正在使用angularx-flatpickr选择带时间的日期。
我的当地时区是+2。

我选择的日期是:'2019.07.10 12:00'
在JS控制台中,我得到: 2019年7月10日星期三12:00:00 GMT + 0200(MitteleuropäischeSommerzeit)
在api帖子中,我看到带有time = 2019-07-10T10:00:00.000Z
的JSON对象 在C#中,我正在使用System.DateTime,并且得到了一个DateTime对象,该对象具有: {10.07.2019 10:00:00}
在存储的日期库中: 10.07.2019 10:00:00
请求数据时返回JS,我使用Date类型的视图模型。但是视图模型中的对象是字符串“ 2019-07-10T10:00:00”
所以现在我可以使用 new Date(“ 2019-07-10T10:00:00”)转换为JS Date。但是由于时区的原因,现在的时间是错误的: 2019年7月10日星期三10:00:00 GMT + 0200(MitteleuropäischeSommerzeit)

我认为将UTC DateTime存储在日期库中是很有意义的。
因此,这意味着我需要将用户的JS时间转换为正确的时区。最佳的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

向您的问题so we can see how your code is working end-to-end添加代码会更有用。但是,我认为从您的描述中我可以发现问题所在:

  

请求数据时返回JS,我使用Date类型的视图模型。但是视图模型中的对象是字符串"2019-07-10T10:00:00"

您将在代码中的某个地方将值从数据库加载回DateTime对象中。例如,如果您使用DataReader加载数据,则可能正在执行以下操作:

DateTime dt = (DateTime) someDataReader["@TheDateTimeDBField"];

这样做时,结果值的Kind属性将设置为DateTimeKind.Unspecified。稍后,这将导致序列化不包含任何偏移量信息。

您的代码没有任何信息可以告诉您数据库中的值采用UTC。对于DateTime值,必须在加载后明确地执行以下操作:

DateTime dt = (DateTime) someDataReader["@TheDateTimeDBField"];
dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc);

这会将Kind属性设置为DateTimeKind.Utc,稍后将在后面附加Z进行序列化。 (之所以有效,是因为JSON.Net的默认日期格式包括the K specifier)。

或者,考虑在您的.NET代码和数据库中(假设MS SQL Server)使用DateTimeOffset值。然后,将存储这些值并使用包括的偏移量对其进行序列化。它将使用+00:00代替Z,但效果相同。

答案 1 :(得分:0)

似乎您的方法几乎都正确。当您从数据库获取日期并将其以字符串格式发送给JS时,该步骤会出现错误。您发送的日期为“ 2019-07-10T10:00:00” 。由于末尾没有 Z ,因此它表示本地时区中的日期。因此,在末尾添加 Z 符号,您将获得UTC时区的日期。所以

new Date("2019-07-10T10:00:00Z")

将导致时间 2019年7月10日星期三12:00:00 GMT + 0200(MitteleuropäischeSommerzeit)

我建议在C#端添加 Z ,以便将日期以正确的格式传输到JS。

有关JS can be found here中日期格式的详细信息。