【问题标题】:Serializing dates for Safari on MacOs in asp.net MVC & WebApi app with ExtJs使用 ExtJs 在 asp.net MVC 和 WebApi 应用程序中为 MacO 上的 Safari 序列化日期
【发布时间】: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


    【解决方案1】:

    我最终应用了这个补丁:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多