在angular7中更改设备时区时自动检测并提示

问题描述 投票:0回答:2

enter image description here我在我的个人资料中保存了一些时区作为“America / New York”。当我的设备移动到“迪拜”时,设备时区会更改,而配置文件时区仍然是“美国/纽约”。

(1)如何自动检测并提示用户他的设备时区已更改且与配置文件/已保存的时区不同?用户也通过web,android和ios设备等渠道访问应用程序。

(2)如何获取可用时区列表,以便在提示进行时区更改时,他可以手动更新配置文件时区与设备时区相同。对于web,android和ios设备等所有设备,此时区列表应该相同。

这里的问题是一些时区返回“亚洲/加尔各答”和“亚洲/加尔各答”。由于要同步所有关于时区的设备。如何获取所有设备的可用时区列表。

javascript angular timezone
2个回答
1
投票

如何自动检测并提示用户他的设备时区已更改且与配置文件/已保存的时区不同?

时区检测包含在this answer中。有多种方法,但最终您希望获取IANA时区标识符(例如America/New_York)以与用户配置文件中保存的值进行比较。

如何获取可用时区列表......

JavaScript没有内置方法,但您可以使用库。例如,Moment-timezone提供moment.tz.names()函数,Date-fns-timezone提供listTimeZones()函数。

...对于所有设备,例如web,android和ios设备,此时区列表应该相同。

虽然大多数环境使用IANA time zone identifiers,但无法保证所有设备都具有完全更新的数据。假设引入了新的时区,并且您的设备检测到它 - 如果您的服务器端平台没有最新的时区数据,那么您可能会遇到错误。您可以在这里做的最好的事情是确保定期检查更新,这些更新因平台而异。

......一些时区回归“亚洲/加尔各答”和“亚洲/加尔各答”

那样就好。 Asia/Kolkata是首选的规范区域,Asia/Calcutta是该区域的链接(或别名)。所有现代平台都应该能够解释。如果您自己尝试这样做,则需要确保在比较之前解析其规范区域的链接。有些库可以为您完成此任务。


0
投票

检查的频率应该基于您自己的分析:如果时区应该自动更新(或者应该立即提示用户更新它自己的时区),每分钟执行检查的setInterval应该是最佳选择。

我认为最好的选择是使用时间参数而不是匹配的字符串,比如与UTC比较时以分钟表示的偏移量。实际上,JavaScript在DateTime对象中放置了一个非常有用的方法:

setInterval(() => {
    let dt = new Date();

    if(dt.getTimezoneOffset() !== localStorage.get('tzOffset') {
        // redirect to a proper component or automatically update the tz
    }
}, 60000);

我假设您将当前时区存储在键'tzOffset'的本地存储中。 getTimezoneOffset返回UTC时间和本地时间之间的分钟差异,与MDN相同

对于另一个问题,使用moment timezones可以帮助很多人在不同设备上获得格式正确的选择:

for(let tz of moment.tz.names()) {
    // do your stuff wuth the timezone name
}
© www.soinside.com 2019 - 2024. All rights reserved.