如何在 Django 中设置时区?

How to set the timezone in Django?

在我的 django 项目的 settings.py 文件中,我有这一行:

TIME_ZONE = 'UTC'

但我希望我的应用在 UTC+2 时区 运行,所以我将其更改为

TIME_ZONE = 'UTC+2'

它给出了错误ValueError: Incorrect timezone setting: UTC+2。正确的做法是什么?

谢谢!

以下是有效时区列表:

http://en.wikipedia.org/wiki/List_of_tz_database_time_zones

您可以使用

TIME_ZONE = 'Europe/Istanbul'

UTC+02:00

tzinfo database 中选择一个有效的时区。他们倾向于采取形式,例如Africa/GaborneUS/Eastern

找到与离您最近的城市相匹配的那个,或者与您的时区相匹配的那个,然后将 TIME_ZONE 的值设置为匹配。

the tz database, you could use pytz module in Python 获取一组所有有效的时区名称 (id):

>>> import pytz # $ pip install pytz
>>> pytz.all_timezones_set
LazySet({'Africa/Abidjan',
         'Africa/Accra',
         'Africa/Addis_Ababa',
         'Africa/Algiers',
         'Africa/Asmara',
         'Africa/Asmera',
         ...
         'UTC',
         'Universal',
         'W-SU',
         'WET',
         'Zulu'})

我发现这个问题是为了将我的 Django 项目的 settings.py 文件中的时区更改为英国。

在 jfs 的解决方案中使用 tz 数据库我找到了答案:

    TIME_ZONE = 'Europe/London'
  1. 将 TIME_ZONE 更改为您当地的时区,并在 'setting.py' 中将 USE_TZ 保持为 True:

    TIME_ZONE = 'Asia/Shanghai'

    USE_I18N = 真

    USE_L10N = 真

    USE_TZ = 真

  2. 这会将日期时间对象作为 UTC 写入并存储到后端数据库。

  3. 然后使用模板标签在你的前端模板中转换UTC时间:

                <td> 
                    {% load tz %}
                    {% get_current_timezone as tz %}
                    {% timezone tz %}
                        {{ message.log_date | time:'H:i:s' }}
                    {% endtimezone %} 
                </td>
    

或简洁地使用模板过滤器

                <td> 
                    {% load tz %}
                    {{ message.log_date | localtime | time:'H:i:s' }}
                </td>
  1. 您可以在官方文档中查看更多详细信息:Default time zone and current time zone

    启用时区支持后,Django 将 UTC 日期时间信息存储在数据库中,在内部使用时区感知日期时间对象,并在模板和表单中将它们转换为最终用户的时区。

有效的时区值基于 Linux 和其他 Unix 系统使用的 tz(时区)数据库。这些值是格式为“Area/Location”的字符串 (xsd:string),其中:

面积是大陆或海洋名称。区域目前包括:

  • 非洲
  • 美国(北美和南美)
  • 南极洲
  • 北极
  • 亚洲
  • 大西洋
  • 澳大利亚
  • 欧洲
  • 等(行政区域。例如,“Etc/UTC”代表 协调世界时。)
  • 印度人
  • 太平洋地区

位置 是城市、岛屿或其他区域名称。

区域名称和输出缩写遵循 POSIX(便携式操作系统界面)UNIX 约定,在格林威治以西使用正号 (+),在格林威治以东使用负号 (-),这是与普遍预期相反。例如,“Etc/GMT+4”对应于 UTC 后 4 小时(即格林威治以西),而不是 UTC(协调世界时)前 4 小时(格林威治以东)。

Here is a list all valid timezones

您可以按如下方式更改 settings.py 中的时区

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Kolkata'

USE_I18N = True

USE_L10N = True

USE_TZ = True

通用解决方案,基于 Django 的 TZ name 支持:

UTC-2 = 'Etc/GMT+2'
UTC-1 = 'Etc/GMT+1'
UTC = 'Etc/GMT+0'
UTC+1 = 'Etc/GMT-1'
UTC+2 = 'Etc/GMT-2'

+/-是有意切换的。

  1. 从以下位置下载最新的 pytz 文件 (pytz-2019.3.tar.gz):

    https://pypi.org/simple/pytz/
    
  2. 将其复制并解压到您项目的 site_packages 目录中

  3. 在 cmd 中转到提取的文件夹和 运行:

    python setup.py install
    
  4. TIME_ZONE = 'Etc/GMT+2' 或国家名称

正确使用Area/Location格式。 示例:

TIME_ZONE = 'Asia/Kolkata'

这对我来说效果很好(我仍在本地测试该应用程序)。 在 settings.py 文件类型中:

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Beirut'

USE_I18N = True

USE_L10N = True

USE_TZ = False

#使用你自己的TIME_ZONE: https://gist.github.com/heyalexej/8bf688fd67d7199be4a1682b3eec7568

添加首选 TIME_ZONE 并将 USE_TZ 设置为 False,如下所示

  • TIME_ZONE = 'Asia/Kolkata'
  • USE_TZ = 假

希望有用。

以下是有效时区列表:

http://en.wikipedia.org/wiki/List_of_tz_database_time_zones

您可以使用达卡时区

TIME_ZONE = 'Asia/Dhaka'

UTC+06:00(达卡或阿斯塔纳)