toLocaleString()如何在Javascript中获取时区

时间:2016-12-19 22:42:58

标签: javascript date time

背景资料

我在处理时区的SPA上苦苦挣扎。我希望捕获用户点击按钮的当前时间,以及根据他们的机器的时区。

我目前的尝试是致电currentDate.toLocaleString()see documentation here)并依赖它给我的时区。我通过使用'en'和'short'参数来改进它,这为我提供了一个非常漂亮的答案。我也只支持支持此功能的chrome(现在无论如何)。

问题

我的问题是我需要能够确认此通话的准确程度。这意味着我想知道这些信息是如何得出的。例如,它是否来自基于偏移量的猜测表?它是否查询操作系统?还有其他一些我不知道的系统吗?

详细

我们在收集日期方面存在一些法律限制,但是法律正在向我提出一些非常技术性的问题,即我们的时区究竟有多么不准确,以及在什么情况下。这些信息最终将是可审计的,看起来我们可能会根据答案在某处提出一些警告。

奖励积分如果有人可以指出我在代码的方向上使用铬这个功能,那么我可以自己确认(法律并不关心那么多,但我现在只是好奇)

双倍奖励积分如果有人可以指出我在最正式的准确方式中建立表示时间,日期和时区的字符串,用于在浏览器中进行用户交互的时刻(特别是在浏览器上的javascript中)

修改

至少我知道浏览器的差异。我只支持“chrome”,虽然我们没有指定版本,但我们将在现代商业拥有的机器上运行,所以我们可以期待一些近期版本。也就是说,如果对通话的时区部分(我正在使用的唯一部分)的整体准确性产生特定影响,我希望能够更深入地研究它。

我们在这条信息之上存储大纪元时间(浏览器)和大纪元时间(服务器)以及offest(浏览器)。也就是说,向非技术用户显示的唯一信息是(现在)时区,所以它有一些压力要尽可能准确。

是的,我检查了moment.js和时刻时区,不要让我尽可能接近LocaleString()(做了一些精确的手测试)

最终答复

我知道这是一个极具挑战性的问题,但我了解到它比我认为的更麻烦。感谢您提供有关此处所面临的限制的信息,这些信息至少可以为我们的业务用户提供一个非常明确的概念,即该数据将受到多大程度的妥协。非常感谢你带领我远离我的无知! ^ _ ^

男,timehard

2 个答案:

答案 0 :(得分:3)

您可以保证的事情是当前时间和当前时间相关的当前时区偏移量是对用户有效的时间计算机 - 由用户设置

var d = new Date();  // the current time on the PC running this code
var o = -d.getTimezoneOffset() / 60; // the current UTC offset on the PC running this code

单独的偏移量不会告诉您完整的时区(请参阅the timezone tag wiki中的“时区!=偏移量”),但会告诉您当前时间与UTC的距离。

这两个值都基于用户通常可以在PC上控制的设置,因此从法律角度来看,您不能相信它们是特定的任何东西。

您可以从toLocaleString获取的值是特定于语言环境的,并且取决于实现。在许多情况下,它们是通过ICU确定的,而CLDR又使用TZDB中的值。时区本身始终从操作系统设置中提取,该设置可能是CLDR mappings标识符,也可能是经过the API docs for the TimeZone class in ICU的Microsoft Windows时区设置。

如果您真的想深入了解,可以看到one of these techniques。 Chrome可能会使用此类的createDefault函数来确定计算机上的时区,以及此类的getDisplayName函数,以生成toLocaleString显示的结果。

WRT提高准确性的替代方法,在这方面你无能为力,因为最终你相信你的用户会给你准确的信息。但是,如果您有一些其他数据可以准确收集(例如GPS位置),则可以尝试enter image description here来解析时区。请记住,聪明的用户可能仍然可以欺骗他们的位置,或者您可能只是根据其来源获得不准确的位置数据,但它通常比用户可以选择的设置更值得信赖 - 尤其是在移动设备上。 / p>

答案 1 :(得分:0)

“这意味着我想知道这个信息是如何导出的。例如,它是从基于偏移量的猜测表派生出来的吗?它是否会查询操作系统?还有其他一些我不知道的系统吗?”

简而言之:用户在安装/配置时在浏览器中指定其区域设置。

长期: 四处搜索,确定用户的区域设置是基于浏览器内置的设置。每个浏览器都有一个特定顺序的语言列表,这些语言被维护以满足本地查询。这些是在安装/配置时设置的。此语言首选项列表用于满足区域设置问题,并且还作为标头在每个HTTP请求上传递。

请参阅: http://norbertlindenberg.com/2012/12/ecmascript-internationalization-api/index.html#Identifiers

基本上,用户将使用他们的语言(直接或通过他们选择的安装程序的版本)配置浏览器,以便它们可用。浏览器将此信息保存在本地,不需要依赖操作系统来保存此信息。