获取与 GMT 时差的时区列表
Get list of time zones with time difference from GMT
我有一个 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>"),...)
假设与 UTC 的时差可以替代 GMT(UTC 和 GMT 几乎相同但不完全相同),您可以从 pytz.timezone
对象中获取时区偏移和相关信息。
对于具有多个偏移量的时区(由于夏令时、历史变化等),您可以从 _tzinfos
属性中获取相关时区和偏移量。对于具有单个偏移量的时区,您可以从 _utcoffset
属性中获取偏移量。
以下示例创建一个字典,其中 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 年初)的各种时区世纪日期),其中大部分都包含在某种 "Mean Time" 变体中,例如 "LMT" for "Local Mean Time"。删除这些的一种蛮力方法是过滤掉所有以 "MT" 结尾的时区缩写,"GMT" 除外。当前使用中可能还有一些我不知道的其他异常,但也应该以与 "GMT".
相同的方式处理
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 if zone == 'GMT' or not zone.endswith('MT')]
else:
timezones[tz] = [(tz, str(timezone(tz)._utcoffset))]
print(timezones)
# {
# 'Africa/Abidjan': [('GMT', '0:00:00')],
# 'Africa/Accra': [('GMT', '0:00:00'), ('+0020', '0:20:00')],
# 'Africa/Addis_Ababa': [('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
# 'Africa/Algiers': [('WET', '0:00:00'), ('WEST', '1:00:00'), ('CET', '1:00:00'), ('CEST', '2:00:00')],
# 'Africa/Asmara': [('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
# ...
# }
我有一个 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>"),...)
假设与 UTC 的时差可以替代 GMT(UTC 和 GMT 几乎相同但不完全相同),您可以从 pytz.timezone
对象中获取时区偏移和相关信息。
对于具有多个偏移量的时区(由于夏令时、历史变化等),您可以从 _tzinfos
属性中获取相关时区和偏移量。对于具有单个偏移量的时区,您可以从 _utcoffset
属性中获取偏移量。
以下示例创建一个字典,其中 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 年初)的各种时区世纪日期),其中大部分都包含在某种 "Mean Time" 变体中,例如 "LMT" for "Local Mean Time"。删除这些的一种蛮力方法是过滤掉所有以 "MT" 结尾的时区缩写,"GMT" 除外。当前使用中可能还有一些我不知道的其他异常,但也应该以与 "GMT".
相同的方式处理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 if zone == 'GMT' or not zone.endswith('MT')]
else:
timezones[tz] = [(tz, str(timezone(tz)._utcoffset))]
print(timezones)
# {
# 'Africa/Abidjan': [('GMT', '0:00:00')],
# 'Africa/Accra': [('GMT', '0:00:00'), ('+0020', '0:20:00')],
# 'Africa/Addis_Ababa': [('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
# 'Africa/Algiers': [('WET', '0:00:00'), ('WEST', '1:00:00'), ('CET', '1:00:00'), ('CEST', '2:00:00')],
# 'Africa/Asmara': [('EAT', '3:00:00'), ('+0230', '2:30:00'), ('+0245', '2:45:00')],
# ...
# }