在特定时区生成日期[重复]
Posted
技术标签:
【中文标题】在特定时区生成日期[重复]【英文标题】:Generating a date in a particular timezone [duplicate] 【发布时间】:2013-10-22 15:28:58 【问题描述】:我有一个时区字符串,例如“太平洋时间(美国和加拿大)”。对于特定日期(包括夏令时),我需要在 UTC 的那个时区获得相当于下午 3 点的时间。我该怎么办?
例如,我需要在 UTC 时间找到 12 月 3 日 PDT 下午 3 点。
【问题讨论】:
Date 能识别时区吗?例如对我来说new Date('2013-10-15 00:25:00 PST').toUTCString(); // "Tue, 15 Oct 2013 08:25:00 GMT"
【参考方案1】:
这似乎对我有用,虽然感觉有点脆弱
new Date('2013-12-03 15:00:00 PDT').toUTCString()
-> "Tue, 03 Dec 2013 22:00:00 GMT"
【讨论】:
这种方法只能识别一小部分时区缩写。请参阅RFC 822 第 5.1 节。一般来说,时区缩写没有用处,因为有太多的歧义。例如,“CST”是“Central Standard Time”还是“China Standard Time”的缩写? 这会起作用,不过如果我能从完整的时区字符串而不是缩写词中做到这一点会很好。 @MattJohnson 另一种选择是将缩写替换为±hhmm
格式的偏移量,例如-0700
或 -0800
.
@PaulS。 - 绝对地。如果您已经知道偏移量,那么战斗就结束了一半,并且不需要缩写或 IANA 形式的实际时区。你不能做的是开始用特定的偏移量替换缩写。重叠和冲突太多了。
请参阅this list,以更好地了解所有可能的时区缩写。【参考方案2】:
那个时区标识符看起来像是来自 Rails 或 Twitter(使用 Rails)。您首先需要将其转换为标准 IANA 区域标识符,例如“America/Los_Angeles”。请参阅ActiveSupport::TimeZone docs 中的MAPPING
声明。
然后你可以使用我提到的库之一here。
特别是,您可能想尝试moment-timezone。您需要针对此特定功能的最新开发版本,因为它是在问题#25 中添加的,当前版本中还没有。然后你可以这样做:
moment.tz("2013-12-03T15:00:00","America/Los_Angeles").utc().format()
您可以将输入/输出格式调整为对您有意义且受moment.js 支持的任何格式。
其他时区库I mentioned 也可能提供类似的功能而无需太多开销,因此值得一看。
【讨论】:
谢谢!这正是我所需要的。 @DanPalumbo - 更新后为您提供了一些代码。以上是关于在特定时区生成日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章
基于时区在 C# 中设置日期时间,例如 +08:00 [重复]