是否有针对这个模糊的几分钟 iOS 日期时间本地错误的修复程序?
Is there a fix for this obscure off-by-a-few-minutes iOS datetime-local bug?
我正在尝试使用 <input type="datetime-local"...>
.
访问 Web 应用程序中的本机 iOS date/time 界面
使用<input>
这种风格时,您设置或获取的时间值是标准ISO格式的字符串,如2019-07-09T16:30
.
您可能会认为,无论您将什么时间作为字符串值输入,您都会在本机界面中看到该时间(尽管重新格式化并且可能更改为 12 小时 AM/PM 形式某些语言环境)将是同一时间。这就是我到目前为止使用 Android 平板电脑所看到的,这就是我使用 iOS.
大多数 的时间
但是对于一个多世纪前的日期,我发现 iOS 显示的时间比我输入的 ISO 时间字符串提前 三分钟 .同样,如果我通过 iOS 编辑时间并坚持大致相同的古董时间段,我从 <input>
返回的时间是三分钟 落后 无论我在屏幕界面中输入什么。
此偏移量取决于时区。我的正常时区是 America/New_York。如果我将 iPhone 或 iPad 切换为 America/Chicago,则会出现同样的错误,但差异是整整 9 分钟。
您可以在此处查看正在运行的错误:https://angular-ios-datetime.stackblitz.io (code here: https://stackblitz.com/edit/angular-ios-datetime)
我知道实际上发生了什么...
1883 年 11 月 18 日,在纽约市 12:03:58 当地时间,时钟拨回三分 58 秒,回到正午。这是全国为改用标准化时区而采取的众多步骤之一。
芝加哥(以及许多其他城市)也进行了类似的更改,但芝加哥从当地时间到标准时间的更改接近九分钟。
<input type="datetime-local"...>
似乎发生的事情是 JavaScript 和 iOS 之间存在冲突,而这两者之一(可能是 JavaScript)没有知道很久以前的时区历史,但另一个人(可能 iOS)确实知道。
那我想知道的是:
有没有一种方法可以使用 <input type="datetime-local"...>
而坚持使用 UTC?也许是 iOS 的非标准功能?
曾经有一个选项 <input type="datetime"...>
(没有 -local
),但它已被弃用,因为大多数当前的网络浏览器都不支持,包括 iOS 上的 Safari。
我同意这是 <input type="datetime-local" />
的 iOS 实现中的错误。它会影响 iOS 上的 Safari 和 Chrome。 (我使用 Safari Mobile 605.1 和 Chrome 75 在 iOS 12 上进行了测试。)
有趣的是,它不仅是历史日期的问题,而且是可能受当地时区影响的任何值的问题。例如,将设备设置为纽约时间,尝试选择 2020-03-08T02:00
.
请注意,我可以到达凌晨 1 点,但 2
显示为灰色。如果您尝试选择它,它会移动到不同的时间。那是因为2:00 AM当天在纽约是无效的。夏令时开始时,时钟从 1:59 AM 前进到 3:00 AM。
问题在于,如果应用程序选择的时区时间与设备时区不同,例如亚利桑那州凤凰城 - DST 不适用。或者可能是不同的国家/地区可能在不同的日期进行 DST 转换。
这一切归结为"local"这个词的解释。
通过 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.
换句话说,它是"a local date and time",而不是"the user's local date and time"。顺便说一下,这与 ISO 8601 规范中的术语完全一致。
不幸的是,不仅 iOS 实现在这方面不正确,Mozilla MDN documentation 也不正确,它之前包含文本 "The user's local time zone is used."(我提交了更新以更正此问题.)
简而言之,datetime-local
应该与任何时区无关。
作为解决方法,请考虑使用两个控件。
<input type="date" /> <input type="time" />
它们会像这样出现在 iOS:
然后您会为每个选择器获得单独的选择器。
它同时解决了 LMT 问题和 DST-gap 问题,因为这两个控件都不对本地时区做任何事情。作为额外的好处,您可以在日期选择器中获得年份,而合并后的日期选择器中缺少年份。
我正在尝试使用 <input type="datetime-local"...>
.
使用<input>
这种风格时,您设置或获取的时间值是标准ISO格式的字符串,如2019-07-09T16:30
.
您可能会认为,无论您将什么时间作为字符串值输入,您都会在本机界面中看到该时间(尽管重新格式化并且可能更改为 12 小时 AM/PM 形式某些语言环境)将是同一时间。这就是我到目前为止使用 Android 平板电脑所看到的,这就是我使用 iOS.
大多数 的时间但是对于一个多世纪前的日期,我发现 iOS 显示的时间比我输入的 ISO 时间字符串提前 三分钟 .同样,如果我通过 iOS 编辑时间并坚持大致相同的古董时间段,我从 <input>
返回的时间是三分钟 落后 无论我在屏幕界面中输入什么。
此偏移量取决于时区。我的正常时区是 America/New_York。如果我将 iPhone 或 iPad 切换为 America/Chicago,则会出现同样的错误,但差异是整整 9 分钟。
您可以在此处查看正在运行的错误:https://angular-ios-datetime.stackblitz.io (code here: https://stackblitz.com/edit/angular-ios-datetime)
我知道实际上发生了什么...
1883 年 11 月 18 日,在纽约市 12:03:58 当地时间,时钟拨回三分 58 秒,回到正午。这是全国为改用标准化时区而采取的众多步骤之一。
芝加哥(以及许多其他城市)也进行了类似的更改,但芝加哥从当地时间到标准时间的更改接近九分钟。
<input type="datetime-local"...>
似乎发生的事情是 JavaScript 和 iOS 之间存在冲突,而这两者之一(可能是 JavaScript)没有知道很久以前的时区历史,但另一个人(可能 iOS)确实知道。
那我想知道的是:
有没有一种方法可以使用 <input type="datetime-local"...>
而坚持使用 UTC?也许是 iOS 的非标准功能?
曾经有一个选项 <input type="datetime"...>
(没有 -local
),但它已被弃用,因为大多数当前的网络浏览器都不支持,包括 iOS 上的 Safari。
我同意这是 <input type="datetime-local" />
的 iOS 实现中的错误。它会影响 iOS 上的 Safari 和 Chrome。 (我使用 Safari Mobile 605.1 和 Chrome 75 在 iOS 12 上进行了测试。)
有趣的是,它不仅是历史日期的问题,而且是可能受当地时区影响的任何值的问题。例如,将设备设置为纽约时间,尝试选择 2020-03-08T02:00
.
请注意,我可以到达凌晨 1 点,但 2
显示为灰色。如果您尝试选择它,它会移动到不同的时间。那是因为2:00 AM当天在纽约是无效的。夏令时开始时,时钟从 1:59 AM 前进到 3:00 AM。
问题在于,如果应用程序选择的时区时间与设备时区不同,例如亚利桑那州凤凰城 - DST 不适用。或者可能是不同的国家/地区可能在不同的日期进行 DST 转换。
这一切归结为"local"这个词的解释。
通过 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.
换句话说,它是"a local date and time",而不是"the user's local date and time"。顺便说一下,这与 ISO 8601 规范中的术语完全一致。
不幸的是,不仅 iOS 实现在这方面不正确,Mozilla MDN documentation 也不正确,它之前包含文本 "The user's local time zone is used."(我提交了更新以更正此问题.)
简而言之,datetime-local
应该与任何时区无关。
作为解决方法,请考虑使用两个控件。
<input type="date" /> <input type="time" />
它们会像这样出现在 iOS:
然后您会为每个选择器获得单独的选择器。
它同时解决了 LMT 问题和 DST-gap 问题,因为这两个控件都不对本地时区做任何事情。作为额外的好处,您可以在日期选择器中获得年份,而合并后的日期选择器中缺少年份。