我正在使用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时间转换为正确的时区。最佳的最佳做法是什么?
答案 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中日期格式的详细信息。