【发布时间】:2019-11-27 07:25:58
【问题描述】:
我继承了一个使用此设置来序列化日期/时间值的网络应用程序。
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified;
应用的所有用户都在 PST 时区。
Firefox 和 Chrome 将“yyyy-mm-ddThh:mi:ss”值解析为本地日期(浏览器本地)。然而,Safari 将"2019-08-16T00:00:00" 解析为new Date("2019-08-16T00:00:00")(即"Thu Aug 15 2019 17:00:00 GMT-0700 (PDT)",而其他两个浏览器将日期解析为"Fri Aug 16 2019 00:00:00 GMT-0700 (Pacific Daylight Time)"。换句话说,Safari 认为日期在祖鲁时区(UTC)中,其他浏览器解释日期就像在当地时区一样。
应用程序使用 ExtJs 6.6,由于这个问题,在数据库中保存为 2019-08-16T00:00:00 的值在 Safari 中呈现为 2019-08-15(在网格或日期字段中表单)。
我还创建了一个 sencha fiddle 来重现此问题 here。当您在 safari 中运行 fiddle 时,Some Date 字段将包含 15-Aug-2019,而在 Chrome 和 FF 中它包含 16-Aug-2019。
我知道根据规范的正确值应该加上时区(参见this)。例如,此值适用于所有浏览器:"2019-08-16T00:00:00-07:00"。
在应用程序中使用 DateTimeZoneHandling.Local 可能是一个更好的选择,但是,现在更改此值可能需要大量的测试工作。也没有授权支持 MacOs 和 Safari 用户。但是,我个人觉得这个问题很烦人,我想探索解决它的方法。
还有哪些其他选项可以为 Safari 解决此问题?是否有一个脚本可以修补 Safari 中 JavaScript 日期的行为,使其与 FireFox/Chrome 中的行为相同?另一种选择是在 ExtJs 中更改这些值的解析,但我不知道在哪里可以做到这一点。我也可以使用 new Date(year, month, day-of-month, hour, minutes, seconds) 在 Safari 中创建本地日期。
其他想法?
谢谢
【问题讨论】:
标签: json datetime extjs safari asp.net-web-api2