javascript - 是否有针对这个模糊的几分钟 iOS 日期时间本地错误的修复程序?

标签 javascript html ios datetime datetimepicker

我正在尝试使用 <input type="datetime-local"...> 访问 Web 应用程序中的 native iOS 日期/时间界面.

当使用 <input> 的这种风格时,你设置或获取的时间值是标准ISO格式的字符串,如2019-07-09T16:30 .

您可能会认为,无论您将什么时间作为字符串值输入,您将在 native 界面中看到的时间(尽管重新格式化并且可能在某些区域更改为 12 小时 AM/PM 格式)是将是同一时间。这就是我目前在使用 Android 平板电脑时看到的情况,也是我使用 iOS 时大部分时间得到的情况。

但对于一个多世纪前的日期,我发现 iOS 显示的时间比我输入的 ISO 时间字符串提前三分钟。同样,如果我通过 iOS 编辑时间,并坚持大致相同的古代时间段,我从 <input> 返回的时间无论我在屏幕界面中输入什么,都落后三分钟。

此偏移量取决于时区。我的正常时区是 America/New_York。如果我将我的 iPhone 或 iPad 切换到美国/芝加哥,也会出现同样的错误,但差异是整整 9 分钟。

您可以在此处查看正在运行的错误:https://angular-ios-datetime.stackblitz.io (此处代码:https://stackblitz.com/edit/angular-ios-datetime)

我知道实际上发生了什么......

1883 年 11 月 18 日,纽约市本地时间 12:03:58,时钟拨回 3 分 58 秒,回到正午。这是全国为改用标准化时区而采取的众多步骤之一。

芝加哥(以及许多其他城市)也进行了类似的更改,但芝加哥从本地时间到标准时间的更改接近九分钟。

<input type="datetime-local"...> 似乎发生了什么是 JavaScript 和 iOS 之间存在冲突,这两者之一(可能是 JavaScript)不知道很久以前的时区历史,但另一个(可能是 iOS)确实知道。

我想知道的是:

有没有办法使用<input type="datetime-local"...>而是坚持使用UTC?也许是 iOS 的非标准功能?

曾经有一个选项<input type="datetime"...> (没有 -local ),但它已被弃用,因为它不受大多数​​当前网络浏览器的支持,包括 iOS 上的 Safari。

iOS screenshot

最佳答案

我同意这是 <input type="datetime-local" /> 的 iOS 实现中的错误.它会影响 iOS 上的 Safari 和 Chrome。 (我使用 Safari Mobile 605.1 和 Chrome 75 在 iOS 12 上进行了测试。)

有趣的是,它不仅是历史日期的问题,而且还有可能受本地时区影响的任何值的问题。例如,将设备设置为纽约时间,尝试选择 2020-03-08T02:00 .

screenshot

请注意,我可以到达凌晨 1 点,但是 2变灰。如果您尝试选择它,它会移动到不同的时间。那是因为当天 2:00 AM 在纽约是无效的。夏令时开始时,时钟从凌晨 1:59 提前到凌晨 3:00。

问题是,如果应用程序选择的时区时间与设备时区不同,例如亚利桑那州凤凰城 - DST 不适用。或者可能是在不同日期进行 DST 转换的不同国家/地区。

这一切归结为对“本地”一词的解释。

通过HTML specification for datetime-local ,上面写着(强调我的):

The input element represents a control for setting the element's value to a string representing a local date and time, with no time-zone offset information.

此外,它 defines a "local date and time"作为:

... consisting of a year, a month, and a day, and a time, consisting of an hour, a minute, a second, and a fraction of a second, but expressed without a time zone.

换句话说,它是“本地日期和时间”,而不是“用户的本地日期和时间”。顺便说一下,这与 ISO 8601 规范中的术语完全一致。

不幸的是,不仅 iOS 实现在这方面不正确,Mozilla MDN documentation 也是如此。 ,之前包含文本“使用用户的本地时区”。 (我提交了更新以更正此问题。)

简而言之,datetime-local应该与任何时区无关。

作为解决方法,请考虑使用两个控件。

<input type="date" /> <input type="time" />

它们在 iOS 中会像这样显示:

screenshot

然后您会为每个人获得单独的选择器。

screenshot screenshot

它同时解决了 LMT 问题和 DST 间隙问题,因为这两个控件都不对本地时区做任何事情。作为额外的好处,您可以在日期选择器中获得年份,而合并后的日期选择器中缺少年份。

关于javascript - 是否有针对这个模糊的几分钟 iOS 日期时间本地错误的修复程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56960515/

相关文章:

javascript - 将 PHP 数组发送到 JS 模块, "import"问题

javascript - 如何在javascript中创建函数的实例?

html - iPad背景附件: fixed issue

ios - 多个 View 处理的触摸事件

javascript - Web api 的 POST 参数设置为 null

javascript - 从 ko.observableArray 中删除项目

jquery - 单击复选框时添加和删除 div

html - CSS 元素不会移动

objective-c - 如何在 iOS 的 Objective-C 中读取音频文件的属性?

ios有没有办法在后台发布facebook和twitter?