Python 获取django的本地时区

Python 获取django的本地时区,python,django,Python,Django,我有一个mysqlDATETIME值,它存储在系统时间UTC中。我需要把它转换成我在django的本地时区。以下是我目前拥有的: # value in mysql `timestamp` 2013-02-01 22:48:45 # settings.py TIME_ZONE = 'America/Los_Angeles' # views.py last_updated = PathLastUpdated.objects.all()[0].timestamp print last_update

我有一个mysql
DATETIME
值,它存储在系统时间UTC中。我需要把它转换成我在django的本地时区。以下是我目前拥有的:

# value in mysql
`timestamp`
2013-02-01 22:48:45

# settings.py
TIME_ZONE = 'America/Los_Angeles'

# views.py
last_updated = PathLastUpdated.objects.all()[0].timestamp
print last_updated
2013-02-01 22:48:45 <-- same as UTC
mysql中的值 `时间戳` 2013-02-01 22:48:45 #设置.py 时区='美国/洛杉矶' #views.py last_updated=PathLastUpdated.objects.all()[0]。时间戳 打印上次更新的
2013-02-01 22:48:45我个人建议不要使用UTC以外的
时区设置。我记得过去在这方面遇到过问题,可能是因为数据库在Django后端使用的时区不同(将值保存在不同的时区)。这意味着比较时间会有很多麻烦,根据你正在做的事情来前后改变时间

一个好的做法通常是在后端使用一个时区(比如UTC),并将前端的时间转换为您所服务的用户时区。

文档包含将
日期时间
对象转换为适当时区以供显示的所有必要细节

您的数据存储在UTC中,这很好。从数据库中获取
DateTime
字段对象时,它将是一个原始的
DateTime.DateTime
对象。没有时区的日期/时间。然后由您来进行转换

您的webapp用户可能位于不同的时区,因此必须为每个请求转换到适当的时区。这就是为什么有一个功能来设置当前时区

如果已安装,则应能够执行以下操作:

from django.utils.timezone import activate
activate(settings.TIME_ZONE)
然后,模板引擎中日期字段的所有输出将自动将原始日期时间对象转换为正确的时区进行显示

如果您只需要一个简单的
datetime.datetime
实例来设置时区,那么直接使用
pytz
模块即可。但是,在视图中这样做是不正常的,因为最好只在演示时转换时区

from pytz import timezone

settings_time_zone = timezone(settings.TIME_ZONE)
last_updated = last_updated.astimezone(settings_time_zone)

我创建了一个简单的中间件来为您处理所有这些内容:

只需安装它并按照说明操作,您就完成了

  • 安装django easy时区

    pip install django-easy-timezones pytz pygeoip
    
  • 将“轻松时区”添加到已安装的应用程序设置中,如下所示:

    INSTALLED_APPS = (
    ...
    'easy-timezones',
    )
    
    >>> from django.utils.timezone import get_current_timezone
    >>> from front.models import Training
    
    >>> tz = get_current_timezone()
    >>> stored_date = Training.objects.first().start_date
    datetime.datetime(2015, 4, 25, 17, 0, tzinfo=<UTC>)
    
    >>> desired_date = stored_date + tz.utcoffset(stored_date)
    datetime.datetime(2015, 4, 25, 14, 0, tzinfo=<UTC>)
    
  • 将EasyTimezoneMiddleware添加到中间件类中

    MIDDLEWARE_CLASSES = (
    ...
    'easy-timezones.middleware.EasyTimezoneMiddleware',
    )
    
  • 将路径添加到设置文件中的:

    GEOIP_DATABASE = '/path/to/your/geoip/database/GeoIP.dat'
    
  • 在模板中启用localtime

    {% load tz %}
        The UTC time is {{ object.date }}
    {% localtime on %}
        The local time is {{ object.date }}
    {% endlocaltime %}
    
  • 塔达


  • 在哭了很多之后,我可以告诉我的国家正确的日期,做这样的事情:

    INSTALLED_APPS = (
    ...
    'easy-timezones',
    )
    
    >>> from django.utils.timezone import get_current_timezone
    >>> from front.models import Training
    
    >>> tz = get_current_timezone()
    >>> stored_date = Training.objects.first().start_date
    datetime.datetime(2015, 4, 25, 17, 0, tzinfo=<UTC>)
    
    >>> desired_date = stored_date + tz.utcoffset(stored_date)
    datetime.datetime(2015, 4, 25, 14, 0, tzinfo=<UTC>)
    

    localtime是一个模板过滤器,这可能会有所帮助

    代码示例:

    from django.utils.timezone import localtime 
    
    desired_datetime = localtime(stored_datetime)
    

    我也遇到了同样的问题。在我的设置中,我设置了
    时区
    ,但MySql中的时间仍然是UTC时间

    # settings.py
    TIME_ZONE = 'Asia/Shanghai'
    
    然后我发现,在settings.py中,
    USE\TZ
    被设置为False

    USE\u TZ=False

    正如@MagicLAMP所指出的,它只适用于单一时区的站点,请检查您的站点是否为国际站点,或者在使用站点的地方是否使用夏令时。

    只需使用即可

    timezone.localtime(arg)
    

    我花了一段时间才找到这个,但我就是这样解决的。我从IP地址猜测用户的时区,然后在Django 2及更高版本中执行此操作:

    {% load tz %}
    {% timezone "Europe/Paris" %}
        Paris time: {{ object.date }}
    {% endtimezone %}
    

    1:在视图中定义时区

    from django.utils import timezone
    
    variable = timezone.now()
    
    2:然后在模板中使用它

    {% load l10n %}
    
    Teresina, {{variable |localize}}.
    

    “我的本地时区”是指服务器运行的时区还是查看页面的客户端的时区?我在
    settings.py
    =“America/Los\u Angeles”中设置的时区如果
    last\u updated
    不是utc,则将最后一行更改为:
    last\u updated\u in\u tz=tz.normalize(last\u updated.astimezone(tz))
    。如果上次更新的
    last\u updated
    是一个朴素的日期时间对象,那么在调用
    .astimezone()
    之前要让它知道:
    aware\u dt=naive\u utc\u dt.replace(tzinfo=pytz.utc)
    (注意:
    .replace()
    只对utc有效,使用
    aware\u dt=some\tz.localize(朴素\u dt,is\dst=None)
    。通过执行“激活(设置.时区)”它发生在未定义设置的情况下。我已经在settings.py上定义了我的时区='UTC'。我应该在哪里定义时区?@MrMartin您需要导入Django设置模块,按照我如何使用它,但要构建API?@Gocht For API,发出请求的实体必须提供有关其时区的信息,以便您能够转换为其时区。这可以通过在请求中使用一个字段来实现,该字段可以设置为指示时区,或者使用一个单独的请求头。我同意你的看法。我也有其他时区的问题。但是,当我从浏览器发送日期时,它没有转换为UTC,您能给我建议一种正确的方法吗?我需要更多关于如何从浏览器发送日期的信息(格式很重要,此格式中是否保存了时区信息)。如果从浏览器发送日期,则必须使用Django将其转换为UTC。我建议一个库可以这样做。谢谢你的回复,问题现在已经解决了,但我不知道它是否正确,因为我是Django&python新手。目前我正在这样做。我从jQueryDatePicker中选择日期和时间,并使用Javascript将其转换为UTC时间,然后发送到服务器。我曾尝试使用pytz libs,但在确定日期时间是从哪个时区开始时出现了问题。这造成了在UTC中转换的问题。我不知道我是对的还是错的,请建议什么是正确的方法。这种方法当然有效,但你给客户增加了更多的逻辑性。通常我会把日期转换放在服务器上。再说一次,如果它对你有效,那也没关系。这绝对不是一个错误的方法。谢谢,我会将其更改为服务器端。根据您的回答,我已经在django应用程序中设置了轻松时区,但如果希望从termi运行我的应用程序