我有以下日期字符串('US/Eastern'),我需要将其转换为UTC:
date_src = '2014-07-07T23:10:00+0'
首先,我将其转换为"有效"格式,以便在以后的进程中操作它。我使用以下命令来获得iso版本的日期:
date = DateTime.parse(date_src).iso8601
在这一点上日期是一个很好的'2014-07-07T23:10:00+00:00'
。我的流程的最后一步是将此日期转换为UTC。我使用以下代码:
TZInfo::Timezone.get('US/Eastern').local_to_utc(date)
问题是这给了我20014作为输出,而不是原始日期的UTC版本。如果我尝试:
TZInfo::Timezone.get('UTC').local_to_utc(date)
我得到2014,这是正确的年份,但仍然是意外的输出。
你知道我做错了什么吗?我可以用什么来解决这个问题?
local_to_utc
实际期望Time
或DateTime
实例:
TZInfo::Timezone.get('US/Eastern').local_to_utc(DateTime.parse(date_src))
# => #<DateTime: 2014-07-08T03:10:00+00:00 ((2456847j,11400s,0n),+0s,2299161j)>
从文档中,您可以得到关于实际发生的事情的提示:
TZInfo
中操作时间的所有方法都可以用于Time
或DateTime
实例,或者具有整数时间戳(即由Time#to_i
返回)。返回值的类型将与传入的类型匹配。
实际发生的是local_to_utc
在输入参数上调用to_i
,该参数在字符串上返回从字符串开头解析的整数(2014年在您的情况下,因为date
是字符串2014-07-07T23:10:00+00:00
),并将时差添加到它- 18000
为"美国/东部"(5小时差),0
为UTC
:
date.to_i
# => 2014
TZInfo::Timezone.get('US/Eastern').local_to_utc(date) - date.to_i
# => 18000
TZInfo::Timezone.get('UTC').local_to_utc(date) - date.to_i
# => 0
所以底线是-你偶然看到了这个奇怪的行为,它源于你使用的api的一些令人惊讶的怪癖的编译…