我正在使用pytz将时区与我的用户个人资料相关联。最初我认为它只包括PST,CST,EST等时区,但是当我运行pytz.country_timezones('US')
时,我会收到以下列表:
[u'America/New_York', u'America/Detroit', u'America/Kentucky/Louisville', u'America/Kentucky/Monticello', u'America/Indiana/Indianapolis', u'America/Indiana/Vincennes', u'America/Indiana/Winamac', u'America/Indiana/Marengo', u'America/Indiana/Petersburg', u'America/Indiana/Vevay', u'America/Chicago', u'America/Indiana/Tell_City', u'America/Indiana/Knox', u'America/Menominee', u'America/North_Dakota/Center', u'America/North_Dakota/New_Salem', u'America/North_Dakota/Beulah', u'America/Denver', u'America/Boise', u'America/Phoenix', u'America/Los_Angeles', u'America/Metlakatla', u'America/Anchorage', u'America/Juneau', u'America/Sitka', u'America/Yakutat', u'America/Nome', u'America/Adak', u'Pacific/Honolulu']
另外:
pytz.all_timezones
== 582
pytz.common_timezones
== 432
我住在德克萨斯州,总是选择芝加哥,因为这就是互联网的运作方式,但现在我必须考虑到这一点,我真的很困惑我们应该在我们的应用程序中使用哪些时区,哪些是多余的。例如,America/Kentucky/Louisville与America/Kentucky/Monticello相同 - 为什么它们都存在?我知道这与印第安纳州的历史时区惨败有关,但为什么数据库没有更新以删除冗余?
我从未住在印第安纳州,所以我不知道居民习惯看到的时区。另外,由于像亚利桑那州这样的异常人员没有参与DST,它并不像仅包括PST,CST等那么简单。
是否有一些正式的TZ数据库时区子集可以解释所有美国居民?
答案 0 :(得分:5)
例如,America / Kentucky / Louisville与America / Kentucky / Monticello相同 - 为什么它们都存在?
因为他们不相同。从现在开始,他们可能会遵守相同的规则,但他们并没有总是这样做。为他们设置单独的区域ID意味着在过去的某个时刻,您仍然可以确定当时的当地时间。
就路易斯维尔和蒙蒂塞洛而言,看看数据看起来与最近的20世纪90年代不同。以下是20世纪90年代的数据,就区域观察到的名称和偏移的时期而言:
America/Kentucky/Louisville
EST: [1989-10-29T06:00:00Z, 1990-04-01T07:00:00Z) -05 (+00)
EDT: [1990-04-01T07:00:00Z, 1990-10-28T06:00:00Z) -04 (+01)
EST: [1990-10-28T06:00:00Z, 1991-04-07T07:00:00Z) -05 (+00)
EDT: [1991-04-07T07:00:00Z, 1991-10-27T06:00:00Z) -04 (+01)
EST: [1991-10-27T06:00:00Z, 1992-04-05T07:00:00Z) -05 (+00)
EDT: [1992-04-05T07:00:00Z, 1992-10-25T06:00:00Z) -04 (+01)
EST: [1992-10-25T06:00:00Z, 1993-04-04T07:00:00Z) -05 (+00)
EDT: [1993-04-04T07:00:00Z, 1993-10-31T06:00:00Z) -04 (+01)
EST: [1993-10-31T06:00:00Z, 1994-04-03T07:00:00Z) -05 (+00)
EDT: [1994-04-03T07:00:00Z, 1994-10-30T06:00:00Z) -04 (+01)
EST: [1994-10-30T06:00:00Z, 1995-04-02T07:00:00Z) -05 (+00)
EDT: [1995-04-02T07:00:00Z, 1995-10-29T06:00:00Z) -04 (+01)
EST: [1995-10-29T06:00:00Z, 1996-04-07T07:00:00Z) -05 (+00)
EDT: [1996-04-07T07:00:00Z, 1996-10-27T06:00:00Z) -04 (+01)
EST: [1996-10-27T06:00:00Z, 1997-04-06T07:00:00Z) -05 (+00)
EDT: [1997-04-06T07:00:00Z, 1997-10-26T06:00:00Z) -04 (+01)
EST: [1997-10-26T06:00:00Z, 1998-04-05T07:00:00Z) -05 (+00)
EDT: [1998-04-05T07:00:00Z, 1998-10-25T06:00:00Z) -04 (+01)
EST: [1998-10-25T06:00:00Z, 1999-04-04T07:00:00Z) -05 (+00)
EDT: [1999-04-04T07:00:00Z, 1999-10-31T06:00:00Z) -04 (+01)
EST: [1999-10-31T06:00:00Z, 2000-04-02T07:00:00Z) -05 (+00)
America/Kentucky/Monticello
CST: [1989-10-29T07:00:00Z, 1990-04-01T08:00:00Z) -06 (+00)
CDT: [1990-04-01T08:00:00Z, 1990-10-28T07:00:00Z) -05 (+01)
CST: [1990-10-28T07:00:00Z, 1991-04-07T08:00:00Z) -06 (+00)
CDT: [1991-04-07T08:00:00Z, 1991-10-27T07:00:00Z) -05 (+01)
CST: [1991-10-27T07:00:00Z, 1992-04-05T08:00:00Z) -06 (+00)
CDT: [1992-04-05T08:00:00Z, 1992-10-25T07:00:00Z) -05 (+01)
CST: [1992-10-25T07:00:00Z, 1993-04-04T08:00:00Z) -06 (+00)
CDT: [1993-04-04T08:00:00Z, 1993-10-31T07:00:00Z) -05 (+01)
CST: [1993-10-31T07:00:00Z, 1994-04-03T08:00:00Z) -06 (+00)
CDT: [1994-04-03T08:00:00Z, 1994-10-30T07:00:00Z) -05 (+01)
CST: [1994-10-30T07:00:00Z, 1995-04-02T08:00:00Z) -06 (+00)
CDT: [1995-04-02T08:00:00Z, 1995-10-29T07:00:00Z) -05 (+01)
CST: [1995-10-29T07:00:00Z, 1996-04-07T08:00:00Z) -06 (+00)
CDT: [1996-04-07T08:00:00Z, 1996-10-27T07:00:00Z) -05 (+01)
CST: [1996-10-27T07:00:00Z, 1997-04-06T08:00:00Z) -06 (+00)
CDT: [1997-04-06T08:00:00Z, 1997-10-26T07:00:00Z) -05 (+01)
CST: [1997-10-26T07:00:00Z, 1998-04-05T08:00:00Z) -06 (+00)
CDT: [1998-04-05T08:00:00Z, 1998-10-25T07:00:00Z) -05 (+01)
CST: [1998-10-25T07:00:00Z, 1999-04-04T08:00:00Z) -06 (+00)
CDT: [1999-04-04T08:00:00Z, 1999-10-31T07:00:00Z) -05 (+01)
CST: [1999-10-31T07:00:00Z, 2000-04-02T08:00:00Z) -06 (+00)
答案 1 :(得分:1)
例如,America / Kentucky / Louisville与America / Kentucky / Monticello相同 - 为什么它们都存在?
两个地点的当前时间可能相同,但情况并非总是如此。
$ perl -MDateTime::Format::Strptime -E'
my @tz = qw( America/Kentucky/Monticello America/Kentucky/Louisville );
my $format = DateTime::Format::Strptime->new(
pattern => "%Y-%m-%dT%H:%M:%S",
time_zone => "UTC",
on_error => "croak",
);
my $dt = $format->parse_datetime("2000-05-01T00:00:00");
for my $tz (@tz) {
say $dt->clone->set_time_zone($tz)->iso8601;
}
'
2000-04-30T19:00:00
2000-04-30T20:00:00
无法从数据库中删除它,因为这会破坏处理过去发生的日期的程序。