json - 使用 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 中创建本地日期。
其他想法?
谢谢
解决方案
我最终应用了这个补丁:
if (Ext.browser.is.Safari) {
Ext.data.field.Date.override({
dateReadFormat: 'Y-m-dTH:i:s'
});
}
ExtJs 用于解析 json 值的方法使用此日期/时间格式,生成的日期使用本地时区。
推荐阅读
- python - 如何使用已计算的 TFIDF 分数计算余弦相似度
- javascript - Angular 4在for循环中插入文件名
- .net - TeamCity:未满足的需求 DotNetFramework4.[56]
- python - 正则表达式匹配python中的json
- python - 对使用按钮 Python 创建的条目的值求和
- angular - 角通用未知错误
- angular - 错误 TS2307:找不到模块“@ng-bootstrap/ng-bootstrap”
- javascript - 如何替换“?” 或来自Javascript中的字符串的“&”
- symfony - Symfony3:“试图从全局命名空间加载类“ZipArchive”。你忘记了“PHPExcel_Shared_ZipArchive”的“use”语句吗?”
- csv - Neo4j 加载 CSV 文件