我有一个javascript日历,它发送给我一个unixtimestamp。我在新加坡。我希望将此时间戳解释为新加坡时间戳,然后转换为utc以与db进行比较。
我不能,为了我自己的生活,弄清楚如何告诉django这个时间戳是来自新加坡的当前时区。
当我打印时间戳的打印声明时,它会增加8个小时(这意味着django认为我在utc中输入时间并将其本地化为新加坡背景)
在许多其他事情中,我尝试过:
start=datetime.datetime.fromtimestamp(int(start_date)).replace(tzinfo=get_current_timezone())
start_date为1325376000(转换为2012-01-01 00:00:00)
然而,当我打印出这个输出时,我得到2012-01-01 08:00:00 + 06:55。我甚至不知道+06:55来自新加坡的时间是+08:00。我迷路了。
感谢您的帮助。
settings.py:
TIME_ZONE = 'Asia/Singapore'
USE_TZ = True
答案 0 :(得分:18)
假设您已安装pytz
:
from datetime import datetime
import pytz
local_tz = pytz.timezone("Asia/Singapore")
utc_dt = datetime.utcfromtimestamp(timestamp).replace(tzinfo=pytz.utc)
local_dt = local_tz.normalize(utc_dt.astimezone(local_tz))
例如:
>>> from datetime import datetime
>>> import pytz
>>> local_tz = pytz.timezone("Asia/Singapore")
>>> utc_dt = datetime.utcfromtimestamp(1325376000).replace(tzinfo=pytz.utc)
>>> utc_dt
datetime.datetime(2012, 1, 1, 0, 0, tzinfo=<UTC>)
>>> local_dt = local_tz.normalize(utc_dt.astimezone(local_tz))
>>> local_dt
datetime.datetime(2012, 1, 1, 8, 0, tzinfo=<DstTzInfo 'Asia/Singapore' SGT+8:00:00 STD>)
>>> local_dt.replace(tzinfo=None)
datetime.datetime(2012, 1, 1, 8, 0)
答案 1 :(得分:5)
将pytz tzinfo对象传递给fromtimestamp()
方法:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
tz = pytz.timezone("Asia/Singapore")
print(datetime.fromtimestamp(1325376000, tz))
# -> 2012-01-01 08:00:00+08:00
注意:结果对象是时区感知的:您可以将其与其他有意识的日期时间对象进行比较,即,您不需要将其转换为UTC进行比较 - 您可以按原样使用它。
我甚至不知道+06:55来自新加坡的时间是+08:00。
由于+06:55
电话无效,您会看到.replace()
。 get_current_timezone()
返回具有变量utc offset的pytz.timezone("Asia/Singapore")
(在不同日期可能有不同的utc偏移量)。当你随机调用.replace()
时(取决于实现),使用tzinfo对象。问题是.replace()
方法不允许pytz.timezone("Asia/Singapore")
为输入日期选择正确的tzinfo。
>>> list(tz._tzinfos.values())
[<DstTzInfo 'Asia/Singapore' MALT+7:00:00 STD>,
<DstTzInfo 'Asia/Singapore' MALT+7:20:00 STD>,
<DstTzInfo 'Asia/Singapore' JST+9:00:00 STD>,
<DstTzInfo 'Asia/Singapore' SMT+6:55:00 STD>,
<DstTzInfo 'Asia/Singapore' SGT+7:30:00 STD>,
<DstTzInfo 'Asia/Singapore' MALT+7:30:00 STD>,
<DstTzInfo 'Asia/Singapore' MALST+7:20:00 DST>,
<DstTzInfo 'Asia/Singapore' LMT+6:55:00 STD>,
<DstTzInfo 'Asia/Singapore' SGT+8:00:00 STD>]
即,+06:55
和+0800
对新加坡都有效(在不同的日期)。这就是为什么你应该只使用具有常量utc偏移量的时区.replace()
,例如utc时区本身(对于任何日期,偏移量为零,始终)。
fromtimestamp(,tz)
方法在内部调用tz.fromutc()
,允许tz
为给定的utc时间选择正确的偏移量。
答案 2 :(得分:5)
以上所有方法均有效,但不是“ django like”。 这是一个简单的示例,Django程序员将如何做到这一点:
from datetime import datetime
from django.utils.timezone import make_aware
# valid timestamp
value = 1531489250
# you can pass the following obj to a DateTimeField, when your settings.USE_TZ == True
datetime_obj_with_tz = make_aware(datetime.fromtimestamp(value))
在Django github timezone module上查看更多实用程序,以获取整个概述...