Javascript C#日期(服务器)=>;Json日期/时间(浏览器)=>;C#日期/时间和时间部分(服务器)问题

Javascript C#日期(服务器)=>;Json日期/时间(浏览器)=>;C#日期/时间和时间部分(服务器)问题,javascript,c#,datetime,asp.net-web-api,json.net,Javascript,C#,Datetime,Asp.net Web Api,Json.net,上下文信息:PST时区、Asp.net Mvc遗留应用程序和WebApi 2.x,该应用程序使用json.net对json、Chrome/FF浏览器进行序列化/反序列化。应用程序配置为: var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.U

上下文信息:PST时区、Asp.net Mvc遗留应用程序和WebApi 2.x,该应用程序使用json.net对json、Chrome/FF浏览器进行序列化/反序列化。应用程序配置为:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified;
测试人员报告了与此日期相关的问题:1977-04-15。以下是流程:

  • C#1977-04-15=>由于使用了未指定的
  • 在浏览器中(在PST时区中),这被解析为:
  • 序列化回C#WebApi服务:
  • 回到C#world,这变成了(我使用linqpad):
似乎C#在当时的PST时区使用了不同于浏览器的偏移量。我在FF&Chrome中测试了它。这正常吗

解决这个问题的最佳方法是什么

一种方法是将DateTimeZoneHandling配置为Newtonsoft.Json.DateTimeZoneHandling.Local,但我不愿意在现有的应用程序上这样做

如果我使用本地,我有:

c#:

在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#land:

这似乎有效,日期匹配

更新:

在C#(linqpad)中进行了更多测试后:

在JavaScript(FF)中,我们有:

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#是错的。我已经在Windows7VM上使用.NETFramework 4.8(528049)进行了测试

更新2:

这越来越有趣了。我用.NETCoreSDK2.1在MacOs上测试了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偏移量的变化

我发现对日期使用
DateTime
令人沮丧

处理问题的一种方法是在某个点提取
.Date
(编辑:或
新日期(起始年、起始月、起始日)
)部分以释放时间部分


编辑:回复:评论: 这是一个可能会有所帮助的黑客。最终,管道的每个元素都需要正常工作


我发现最好的方法是使用字符串(“yyyy-MM-dd”)或
int
s表示三个部分。

Z表示“祖鲁时间”(即UTC+0)。PST为-7,因此如果转换为本地(PST)时间,我希望从以Z结尾的ISO8601日期时间中减去7小时。是的,但问题是浏览器使用-8小时,而C#使用-7小时。除非我看不到明显的东西。服务器上的时区设置与客户端相同吗?在这个日期前后,夏令时是否有任何历史变化,一方可能注意到,另一方可能没有?是的,它们是相同的,即在PST区域。我不知道有什么变化,但我没有看。我现在正在做。浏览器在1977-04-25向DST报告更改,即偏移量从-8更改为-7<代码>var dt=新日期(1977年3月25日);dt.togmString()在FF中生成:“1977年4月25日星期一07:00:00 GMT”。我完全同意。我想这就是我要做的,但我不喜欢,因为我必须回去找到所有的地点。这是相当危险的,除非你只使用一个时区。是的,我的所有用户都在同一时区,否则我不会这么做。谢谢你指出这一点。我要做很多测试。你必须小心那些有日光节约时间的时区,因为从理论上讲,时间可以倒退一天(我不是DLST专家,也许这是不可能的)。
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"
"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\""
Console.WriteLine(DateTime.Parse("1977-04-15T07:00:00.000Z"));
Output:1977-04-15 00:00:00

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
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"
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]
    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