乔达时间 DateTimeZone

Abu*_*kar 1 java timezone jodatime

我在浏览joda 网站的时区页面时发现了这个

-05:00  EST   
-05:00  EST5EDT   
-05:00  Etc/GMT+5   
Run Code Online (Sandbox Code Playgroud)

我只是想知道这是什么EST5EDT意思,我通常使用EST所以只是想知道它。

在发布问题之前我已经搜索过并没有发现任何内容。

Mik*_*keD 5

US/Eastern我遇到了、Americas/New_York、 和 的问题EST5EDT。这是我发现的。

对于《1966 年统一时间法案》于1967 年生效之后的日期,这些时区都是相同的。此外,美国在世界大战期间执行了标准 DST 规则,因此 1918-1919 年和 1942-1945 年它们都是相同的。

对于 1918 年之前、1920 年至 1941 年(含)以及 1946 年至 1966 年(含)之间的任何日期,EST5EDT始终与 相同EST。没有观察到夏令时。1883 年 11 月 18 日 12:03:58 之前的任何日期都将被视为时区 EST 存在。

1967 年之前,将提供纽约市观察到的Americas/New_York时间。因此,夏令时将遵循纽约市或纽约州政府制定的规则。1883 年 11 月 18 日 12:03:58 之前的任何日期都将采用当地时间,与 UTC 的偏移量为 -4:56:02。

下面是显示差异的 Ruby 片段:

# you may need to install the tzinfo gem with
# gem install tzinfo
require 'tzinfo'

# Using EST5EDT
# In 1966 DST is not observed.
Time.new(1966, 6, 1, 0, 0, 0, TZInfo::Timezone.get("EST5EDT"))
=> 1966-06-01 00:00:00 -0500

#  DST is observed in 1967.
Time.new(1967, 6, 1, 0, 0, 0, TZInfo::Timezone.get("EST5EDT"))
=> 1967-06-01 00:00:00 -0400

# Now with America/New_York
# DST is observed in 1966
Time.new(1966, 6, 1, 0, 0, 0, TZInfo::Timezone.get("America/New_York"))
=> 1966-06-01 00:00:00 -0400

# DST is also observed in 1967
Time.new(1967, 6, 1, 0, 0, 0, TZInfo::Timezone.get("America/New_York"))
=> 1967-06-01 00:00:00 -0400

# America/New_York yields local time for pre-timezone dates.
Time.new(1867, 6, 1, 0, 0, 0, TZInfo::Timezone.get("America/New_York"))
=> 1867-06-01 00:00:00 -0456

# But EST5EDT retroactively applies timezones
Time.new(1867, 6, 1, 0, 0, 0, TZInfo::Timezone.get("EST5EDT"))
=> 1867-06-01 00:00:00 -0500
Run Code Online (Sandbox Code Playgroud)

EST5EDT如果您有多个系统,其中一个假设另一个假设Americas/New_York,特别是当系统将DATE字段存储为DATETIME将小时/分钟/秒设置为午夜的字段时,可能会发生奇怪的事情。对于最近的任何数据来说,数据可能看起来都不错。但例如,从 1966 年夏天开始的生日可能会移动一个小时,然后被截断,使其看起来是前一天。

如果您正在处理阿拉斯加的旧日期,为了额外的乐趣,您需要记住阿拉斯加是从俄罗斯购买的。1867 年 10 月 18 日之前的日期位于国际日期变更线的另一侧,并使用儒略历,而不是公历。例如,朱诺从 1867 年 10 月 6 日(儒略历)+15:02:19 变为 1867 年 10 月 18 日(公历)-8:57:41。(TZInfo 库不处理公历到儒略历的更改。)

require 'tzinfo'

Time.new(1867, 10, 18, 0, 0, 0, TZInfo::Timezone.get("America/Juneau"))
=> 1867-10-18 00:00:00 +1502

Time.new(1867, 10, 19, 0, 0, 0, TZInfo::Timezone.get("America/Juneau"))
#error message
TZInfo::AmbiguousTime (1867-10-19 00:00:00 is an ambiguous local time.)

Time.new(1867, 10, 20, 0, 0, 0, TZInfo::Timezone.get("America/Juneau"))
=> 1867-10-20 00:00:00 -0857

# The Ruby DateTime datatype handles Julian,
# so convert Time to DateTime then to julian
Time.new(1867, 10, 18, 0, 0, 0, TZInfo::Timezone.get("America/Juneau")).to_datetime.julian
=> 1867-10-06 00:00:00 +1502
Run Code Online (Sandbox Code Playgroud)