Python/Django: 需要一个包含pytz常见时区名称和UTC偏差的列表框/下拉菜单

0 投票
2 回答
1229 浏览
提问于 2025-04-17 14:13

我需要一个带有时区名称的列表框或下拉菜单,这些名称是与UTC(协调世界时)的差异。

<select style="cursor:pointer; min-width: 300px;" name="timezone">
    {% for tz in timezones %}
        <option value="{{ tz }}"{% if tz == TIME_ZONE %} selected="selected"{% endif %}>{{ tz }}</option>
    {% endfor %}
</select>

我用以下内容填充这个列表:'timezones': pytz.common_timezones, 'TIME_ZONE': request.session['django_timezone'],在渲染响应时...

但是我得到的只是一个名称列表。我需要的是每个时区与UTC的差异名称列表。

举个例子:

America/XYZ UTC-xxxx/UTC-xxxx+1

Europe/XPTO UTC+xxxx

补充说明:我希望能得到每个时区当前已知的时差,就像这里显示的 http://www.timeanddate.com/worldclock/,并且如果可能的话,还想要过去一两年的时差信息(类似于 http://www.timeanddate.com/library/abbreviations/timezones/))。

非常感谢任何提供的帮助!

2 个回答

0

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种情况可能会让人感到困惑,但其实大多数问题都有解决的方法。

首先,了解错误信息是很重要的。错误信息通常会告诉你出错的地方和原因。即使你不太懂这些信息,也可以尝试在网上搜索一下,看看有没有人遇到过类似的问题。

其次,调试代码是一个很好的习惯。调试就是逐步检查代码,看看每一部分是否按预期工作。你可以在代码中加入一些打印语句,来观察变量的值和程序的执行流程,这样可以帮助你找到问题所在。

最后,别忘了向社区寻求帮助。像StackOverflow这样的论坛上,有很多经验丰富的程序员,他们乐意分享自己的知识和经验。你可以把你的问题描述清楚,附上相关的代码,通常会有人愿意帮你解答。

总之,遇到问题时不要慌张,仔细分析错误信息,调试代码,并向他人请教,通常都能找到解决办法。

 {% load tz %}

 <select style="cursor:pointer; min-width: 300px;" name="timezone">
     {% for tz in timezones %}
    <option value="{{ tz }}"{% if tz == TIME_ZONE %} selected="selected"{% endif %}>
        {{ tz }} - {{tz|utc}}
    </option>
    {% endfor %}
 </select>
0

我遇到了这个:

def get_timezones_with_gmt_diff(timezone_string_list = None):
    """
    Converts a datetime object into string.
    """
    if timezone_string_list:
        timezone_list = timezone_string_list
    else:
        timezone_list = pytz.common_timezones

    datetime1 = datetime.strptime("10-07-%s 00:00:00" % datetime.utcnow().year, "%d-%m-%Y %H:%M:%S")
    datetime2 = datetime.strptime("10-12-%s 00:00:00" % datetime.utcnow().year, "%d-%m-%Y %H:%M:%S")

    result_dict = {}
    for time_zone in timezone_list:
        result_dict[time_zone] = [Date.timedelta_in_seconds(pytz.timezone(time_zone).localize(datetime1).tzinfo._utcoffset)/3600,
                                  Date.timedelta_in_seconds(pytz.timezone(time_zone).localize(datetime2).tzinfo._utcoffset)/3600,
                                  time_zone.replace("/", " - ").replace("_", " "),
                                  Date.timedelta_in_seconds(pytz.timezone(time_zone).localize(datetime1).tzinfo._utcoffset)/3600 !=
                                  Date.timedelta_in_seconds(pytz.timezone(time_zone).localize(datetime2).tzinfo._utcoffset)/3600]

    sorted_result_dict = OrderedDict(sorted(result_dict.items(), key=lambda t: t[1][2]))
    return sorted_result_dict

def get_timezones_for_listbox(time_zones_dict):
    list = []
    for time_zone_tuple in time_zones_dict:
        # Has different DST/Summer times:
        if time_zones_dict[time_zone_tuple][3]:
            new_item = "%s      UCT %s/%s" % (str(time_zones_dict[time_zone_tuple][2]), str(time_zones_dict[time_zone_tuple][0]), str(time_zones_dict[time_zone_tuple][1]))
        # Does not change datetime:
        else:
            new_item = "%s      UCT %s" % (str(time_zones_dict[time_zone_tuple][2]), str(time_zones_dict[time_zone_tuple][0]))
        list.append(new_item)
    return list

def timedelta_in_seconds(duration):
    days, seconds = duration.days, duration.seconds
    return days * 24 * 60 * 60 + seconds

当然,我会进一步调整这两个方法,以便从我的输入中得到想要的结果。

撰写回答