简要总结:纯粹通过基于文本的用户输入来获取时区的最佳方式/最佳实践是什么?我在尝试一个非常棘手的任务吗?
背景是:我正在研究一个nodejs聊天机器人,它可以帮助安排一个主要在北美的小组的活动,但也有来自全球各地的参与者。我能够听取各种用户输入和相应的响应。但是,除了用户名之外,我可用的API不返回任何其他内容。
我的命令输入计划如下所示:
!Event datetime="MM-DD-YYYY h:mm a" timezone="PST" name="Foobar"
Through moment我可以用datetime解析一个moment。然而,我在应用时区方面失败了。我的客户通常不熟悉UTC/GMT系统。他们大多以北美或欧盟为基础,更习惯于缩写。我想使它尽可能地用户友好,但是我如何将它们的时区输入映射到tz数据库样式以便在代码中使用呢?我可以把他们重定向到关于tz数据库和所有不同城市的wiki页面,但它是一个相当大的列表,对普通人来说不是很友好。
我正在尝试时刻-时区,我所拥有的最接近的东西基本上是UTC偏移到描述+ tz数据库名称的映射表。比如:
var TIMEZONE_MAPPINGS = {
"UTC+9" : "Asia/Tokyo",
...
"UTC-8" : "America/Los_Angeles",
}
但我觉得这是非常hackish,并不是真的很适合夏令时,当我选择一个"众所周知"的项目为每个偏移。
有更好的方法来接收这样的输入吗?或者我应该放弃,通过UTC接收所有的东西,然后解释一下UTC是什么?
您应该只接受tzdb区域id,例如"America/Los_Angeles"
-
缩写不起作用,因为缩写可能有歧义。考虑到CST有5种不同的含义,包括中国标准时间。
-
来自固定偏移量的偏移量或映射不起作用,因为"Time Zone != Offset"。查看时区标签wiki在这里的StackOverflow。
特别地,考虑到
"America/Los_Angeles"
在一年中的部分时间里只有UTC-8,当它处于太平洋标准时间时。在一年中的其他时间,即夏季,使用UTC-7表示太平洋夏令时。另外,考虑到UTC+9在几个地方被观测到,而不仅仅是在
"Asia/Tokyo"
。例如,"Asia/Yakutsk
"全年使用,而"Asia/Ulaanbaatar"
只在夏季使用。
在命令行中,没有比原始标识符更好的选择了。如果您有某种UI,那么您可以提示本地化选择,但是对于原始命令行,您可以做的事情不多。