Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从GMT获取具有时差的时区列表_Python_Python 3.x_Timezone_Pytz_Django 1.11 - Fatal编程技术网

Python 从GMT获取具有时差的时区列表

Python 从GMT获取具有时差的时区列表,python,python-3.x,timezone,pytz,django-1.11,Python,Python 3.x,Timezone,Pytz,Django 1.11,我有一个Django应用程序和一个硬编码时区列表。我知道pytz可以用来获取所有时区的列表。但它并没有显示它们相对于GMT的时差。请建议如何获得这样的列表 TIMEZONE_CHOICES = ( ("<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>", "<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>"), ("<DstTzInfo '

我有一个Django应用程序和一个硬编码时区列表。我知道
pytz
可以用来获取所有时区的列表。但它并没有显示它们相对于GMT的时差。请建议如何获得这样的列表

TIMEZONE_CHOICES = (
    ("<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>", "<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>"),
    ("<DstTzInfo 'Africa/Accra' LMT-1 day, 23:59:00 STD>", "<DstTzInfo 'Africa/Accra' LMT-1 day, 23:59:00 STD>"),
    ("<DstTzInfo 'Africa/Addis_Ababa' LMT+2:27:00 STD>", "<DstTzInfo 'Africa/Addis_Ababa' LMT+2:27:00 STD>"),
    ("<DstTzInfo 'Africa/Algiers' LMT+0:12:00 STD>", "<DstTzInfo 'Africa/Algiers' LMT+0:12:00 STD>"),
    ("<DstTzInfo 'Africa/Asmara' LMT+2:27:00 STD>", "<DstTzInfo 'Africa/Asmara' LMT+2:27:00 STD>"),...)
TIMEZONE\u选项=(
("", ""),
("", ""),
("", ""),
("", ""),
("", ""),...)

假设与UTC的时差是GMT的可接受替代方案(UTC和GMT几乎相同,但并不完全相同),您可以从
pytz.timezone
对象获取时区偏移和相关信息

对于具有多个偏移的时区(由于夏令时、历史变化等),您可以从
\u tzinfos
属性获取相关的分区和偏移。对于具有单个偏移量的时区,可以从
\u utcoffset
属性获取偏移量

下面的示例创建一个dict,其中
pytz.all_timezones
中的每个时区都是一个键,值是包含相关区域和偏移量信息的元组列表

from pytz import all_timezones, timezone

timezones = {}
for tz in all_timezones:
    tzinfos = getattr(timezone(tz), '_tzinfos', None)
    if tzinfos:
        timezones[tz] = [(zone, str(offset)) for offset, dst, zone in tzinfos]
    else:
        timezones[tz] = [(tz, str(timezone(tz)._utcoffset))]

print(timezones)
# {
#     'Africa/Abidjan': [('LMT', '-1 day, 23:44:00'), ('GMT', '0:00:00')],
#     'Africa/Accra': [('LMT', '-1 day, 23:59:00'), ('GMT', '0:00:00'), ('+0020', '0:20:00')],
#     'Africa/Addis_Ababa': [('LMT', '2:27:00'), ('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
#     'Africa/Algiers': [('LMT', '0:12:00'), ('PMT', '0:09:00'), ('WET', '0:00:00'), ('WEST', '1:00:00'), ('CET', '1:00:00'), ('CEST', '2:00:00')],
#     'Africa/Asmara': [('LMT', '2:27:00'), ('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
#     ...
#     }
如果您喜欢一个列表,其中每个区域的信息以字符串形式连接(如您的示例),则可以按如下方式进行修改

timezones = []
for tz in all_timezones:
    tzinfos = getattr(timezone(tz), '_tzinfos', None)
    if tzinfos:
        timezones.extend([' '.join([tz, zone, str(offset)]) for offset, dst, zone in tzinfos])
    else:
        timezones.append(' '.join([tz, str(timezone(tz)._utcoffset)]))
根据您关于删除带有偏移量的时区的评论,这些偏移量不在输出的四分之一小时间隔内,您可能希望删除历史日期(通常是19世纪和20世纪早期日期)中包含的各种时区,其中大多数都作为某种“平均时间”变量(如“LMT”)包含“当地平均时间”。一种强力的方法是过滤掉除“GMT”之外的所有以“MT”结尾的时区缩写。在当前的使用中,可能还有一些我不知道的例外情况,但也应该以与“GMT”相同的方式处理


假设与UTC的时差是GMT的可接受替代方案(UTC和GMT几乎相同,但并不完全相同),则可以从
pytz.timezone
对象获取时区偏移和相关信息

对于具有多个偏移的时区(由于夏令时、历史变化等),您可以从
\u tzinfos
属性获取相关的分区和偏移。对于具有单个偏移量的时区,可以从
\u utcoffset
属性获取偏移量

下面的示例创建一个dict,其中
pytz.all_timezones
中的每个时区都是一个键,值是包含相关区域和偏移量信息的元组列表

from pytz import all_timezones, timezone

timezones = {}
for tz in all_timezones:
    tzinfos = getattr(timezone(tz), '_tzinfos', None)
    if tzinfos:
        timezones[tz] = [(zone, str(offset)) for offset, dst, zone in tzinfos]
    else:
        timezones[tz] = [(tz, str(timezone(tz)._utcoffset))]

print(timezones)
# {
#     'Africa/Abidjan': [('LMT', '-1 day, 23:44:00'), ('GMT', '0:00:00')],
#     'Africa/Accra': [('LMT', '-1 day, 23:59:00'), ('GMT', '0:00:00'), ('+0020', '0:20:00')],
#     'Africa/Addis_Ababa': [('LMT', '2:27:00'), ('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
#     'Africa/Algiers': [('LMT', '0:12:00'), ('PMT', '0:09:00'), ('WET', '0:00:00'), ('WEST', '1:00:00'), ('CET', '1:00:00'), ('CEST', '2:00:00')],
#     'Africa/Asmara': [('LMT', '2:27:00'), ('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
#     ...
#     }
如果您喜欢一个列表,其中每个区域的信息以字符串形式连接(如您的示例),则可以按如下方式进行修改

timezones = []
for tz in all_timezones:
    tzinfos = getattr(timezone(tz), '_tzinfos', None)
    if tzinfos:
        timezones.extend([' '.join([tz, zone, str(offset)]) for offset, dst, zone in tzinfos])
    else:
        timezones.append(' '.join([tz, str(timezone(tz)._utcoffset)]))
根据您关于删除带有偏移量的时区的评论,这些偏移量不在输出的四分之一小时间隔内,您可能希望删除历史日期(通常是19世纪和20世纪早期日期)中包含的各种时区,其中大多数都作为某种“平均时间”变量(如“LMT”)包含“当地平均时间”。一种强力的方法是过滤掉除“GMT”之外的所有以“MT”结尾的时区缩写。在当前的使用中,可能还有一些我不知道的例外情况,但也应该以与“GMT”相同的方式处理


我们可以从输出中删除44、14等分钟吗?因为时区的差异通常是15、30和45分钟加上小时。@SachinSingh-您可能希望删除只有历史日期才包含的具有异常偏移的时区。有关详细信息,请参阅答案编辑。我们是否可以从输出中删除44、14等分钟?因为时区的差异通常是15、30和45分钟加上小时。@SachinSingh-您可能希望删除只有历史日期才包含的具有异常偏移的时区。有关详细信息,请参阅答案编辑。