我在我的个人资料中保存了一些时区作为“America / New York”。当我的设备移动到“迪拜”时,设备时区会更改,而配置文件时区仍然是“美国/纽约”。
(1)如何自动检测并提示用户他的设备时区已更改且与配置文件/已保存的时区不同?用户也通过web,android和ios设备等渠道访问应用程序。
(2)如何获取可用时区列表,以便在提示进行时区更改时,他可以手动更新配置文件时区与设备时区相同。对于web,android和ios设备等所有设备,此时区列表应该相同。
这里的问题是一些时区返回“亚洲/加尔各答”和“亚洲/加尔各答”。由于要同步所有关于时区的设备。如何获取所有设备的可用时区列表。
如何自动检测并提示用户他的设备时区已更改且与配置文件/已保存的时区不同?
时区检测包含在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
是该区域的链接(或别名)。所有现代平台都应该能够解释。如果您自己尝试这样做,则需要确保在比较之前解析其规范区域的链接。有些库可以为您完成此任务。
检查的频率应该基于您自己的分析:如果时区应该自动更新(或者应该立即提示用户更新它自己的时区),每分钟执行检查的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
}