上下文信息:PST时区,具有WebApi 2.x的Asp.net Mvc旧版应用程序,使用json.net对JSON,Chrome / FF浏览器进行序列化/反序列化。该应用配置了:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified;
测试人员报告了一个与此日期有关的问题:1977-04-15。这是流程:
var dt = new Date("1977-04-15T00:00:00")
dt
Output: Date Fri Apr 15 1977 00:00:00 GMT-0800 (Pacific Standard Time)
JSON.stringify(dt);
Output: "\"1977-04-15T08:00:00.000Z\""
Console.WriteLine(DateTime.Parse("1977-04-15T08:00:00.000Z"));
Output: 1977-04-15 01:00:00
在该日期,C#似乎使用了与PST时区不同的偏移量。我在FF和Chrome中对其进行了测试。这正常吗?
解决此问题的最佳方法是什么?
一种方法是将DateTimeZoneHandling配置为Newtonsoft.Json.DateTimeZoneHandling.Local,但我不愿意在现有应用程序上进行此操作。
如果我使用本地,则有:
c#:
var date = new DateTime(1977, 04, 15); //, 0, 0, 0, DateTimeKind.Local);
JsonSerializerSettings settings = new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Local
};
Console.WriteLine(JsonConvert.SerializeObject(date, settings));
Ouput: "1977-04-15T00:00:00-07:00"
在Javascript领域:
"1977-04-15T00:00:00-07:00"
dt
Output: Date Thu Apr 14 1977 23:00:00 GMT-0800 (Pacific Standard Time)
JSON.stringify(dt)
Output: "\"1977-04-15T07:00:00.000Z\""
回到C#领域:
Console.WriteLine(DateTime.Parse("1977-04-15T07:00:00.000Z"));
Output:1977-04-15 00:00:00
这似乎可行,日期匹配。
更新:
经过更多测试后,我们使用C#(linqpad):
var date = new DateTime(1977, 04, 03, 0, 0, 0, DateTimeKind.Local);
date.ToLongDateString().Dump();
date.ToUniversalTime().Dump();
date = new DateTime(1977, 04, 04, 0, 0, 0, DateTimeKind.Local);
date.ToLongDateString().Dump();
date.ToUniversalTime().Dump();
Output:
Sunday, April 03, 1977
1977-04-03 08:00:00
Monday, April 04, 1977
1977-04-04 07:00:00
在JavaScript(FF)中,我们有:
var dt = new Date(1977, 3, 24);
dt.toGMTString()
var dt = new Date(1977, 3, 25);
dt.toGMTString()
Output:
"Sun, 24 Apr 1977 08:00:00 GMT"
"Mon, 25 Apr 1977 07:00:00 GMT"
DST时间表似乎存在差异。
我对Java世界充满好奇,所以我在scala中运行了这个
scala> ZonedDateTime.of(1977, 4, 24, 0, 0, 0, 0, ZoneId.of(ZoneId.SHORT_IDS.get("PST")))
res8: java.time.ZonedDateTime = 1977-04-24T00:00-08:00[America/Los_Angeles]
scala> ZonedDateTime.of(1977, 4, 25, 0, 0, 0, 0, ZoneId.of(ZoneId.SHORT_IDS.get("PST")))
res9: java.time.ZonedDateTime = 1977-04-25T00:00-07:00[America/Los_Angeles]
看来C#是错误的。我已经在具有.Net framework 4.8(528049)的Windows 7 VM上进行了测试。
更新2:
这变得越来越有趣。我在具有.net core sdk 2.1的MacO上测试了F#。
let mutable dt = System.DateTime(1977, 04, 24, 0, 0, 0, System.DateTimeKind.Local)
printfn "%s" (dt.ToLongDateString())
printfn "%A" (dt.ToUniversalTime())
let dt = System.DateTime(1977, 04, 25, 0, 0, 0, System.DateTimeKind.Local)
printfn "%s" (dt.ToLongDateString())
printfn "%A" (dt.ToUniversalTime())
Output:
Sunday, April 24, 1977
4/24/77 8:00:00 AM
Monday, April 25, 1977
4/25/77 7:00:00 AM
请注意DST偏移量更改。
答案 0 :(得分:0)
<rant>
我发现DateTime
使用令人沮丧的日期</rant>
处理问题的一种方法是在某个时候提取.Date
(编辑:或new Date(orig.Year, orig.Month, orig.Day)
)部分,以放松时间部分。
编辑:回复:评论: 这可能会有所帮助。最终,管道的每个元素都需要正常工作。
我发现最好的方法是对这3个部分使用字符串(“ yyyy-MM-dd”)或int
。