首页 > 解决方案 > 使用 ExtJs 在 asp.net MVC 和 WebApi 应用程序中为 MacO 上的 Safari 序列化日期

问题描述

我继承了一个使用此设置来序列化日期/时间值的 Web 应用程序。

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 认为日期在 Zulu 时区(UTC)中,其他浏览器将日期解释为在本地时区中。

该应用程序使用 ExtJs 6.6,并且由于这个问题,在数据库中保存为 2019-08-16T00:00:00 的值在 Safari 中呈现为 2019-08-15(在表格中的网格或日期字段中) .

我还创建了一个 sencha fiddle 来重现这个问题。当您在 safari 中运行 fiddle 时,Some Date 字段将包含 15-Aug-2019,而在 Chrome 和 FF 中它包含 16-Aug-2019。

我知道根据规范的正确值应该添加时区(也见这个)。例如,此值适用于所有浏览器:"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 中创建本地日期。

其他想法?

谢谢

标签: jsondatetimeextjssafariasp.net-web-api2

解决方案


我最终应用了这个补丁:

if (Ext.browser.is.Safari) {
  Ext.data.field.Date.override({
    dateReadFormat: 'Y-m-dTH:i:s'
  });
}

ExtJs 用于解析 json 值的方法使用此日期/时间格式,生成的日期使用本地时区。


推荐阅读