TZ数据库和多个美国时区

时间:2015-03-13 19:00:54

标签: python django timezone pytz

我正在使用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/LouisvilleAmerica/Kentucky/Monticello相同 - 为什么它们都存在?我知道这与印第安纳州的历史时区惨败有关,但为什么数据库没有更新以删除冗余?

我从未住在印第安纳州,所以我不知道居民习惯看到的时区。另外,由于像亚利桑那州这样的异常人员没有参与DST,它并不像仅包括PST,CST等那么简单。

是否有一些正式的TZ数据库时区子集可以解释所有美国居民?

2 个答案:

答案 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

无法从数据库中删除它,因为这会破坏处理过去发生的日期的程序。