2012-09-25 44 views
9

Tôi có lịch javascript đang gửi cho tôi một unixtimestamp. Tôi đang ở Singapore. Tôi muốn dấu thời gian này được hiểu là dấu thời gian của Singapore và sau đó được chuyển đổi thành utc để so sánh với db.Dấu thời gian Unix để datetime trong django với múi giờ

Tôi không thể, cho cuộc sống của bản thân mình, tìm ra cách nói với django rằng dấu thời gian này là từ múi giờ hiện tại, Singapore.

Khi tôi làm một tuyên bố in của dấu thời gian, nó bổ sung thêm 8 giờ để thời gian (có nghĩa là django nghĩ rằng tôi đầu vào thời điểm đó trong utc và được bản địa hóa nó vào bối cảnh Singapore)

Trong số nhiều thứ khác , tôi đã cố gắng: start=datetime.datetime.fromtimestamp(int(start_date)).replace(tzinfo=get_current_timezone())

các start_date là 1325376000 (mà dịch để 2012-01-01 00:00:00)

Tuy nhiên, khi tôi in ra những điều này tôi nhận được 2012/01/01 08 : 00: 00 + 06: 55. Tôi thậm chí không biết nơi +06: 55 đến từ khi singapore là +08: 00. Tôi đang bị lạc.

Cảm ơn sự giúp đỡ của bạn.

settings.py:

TIME_ZONE = 'Asia/Singapore'

USE_TZ = True

+0

dấu thời gian posix '1325376000' là '' 2012-01-01 00:00:00 UTC + 0000'' và' '2012-01-01 08:00:00 SGT + 0800''. Tại sao bạn nghĩ nó phải là '00: 00: 00' ở Singapore? – jfs

Trả lời

13

Giả sử bạn đã có pytz cài đặt:

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)) 

Ví dụ:

>>> 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) 
+0

Cảm ơn bạn! Hoạt động hoàn hảo. – nknj

+0

Phần nào trong câu trả lời của tôi phụ thuộc vào múi giờ của máy chủ? Ngoài ra, 'tz.localize (dt)' của 'pytz' giống hệt nhau (trong trường hợp này) là' tz.normalize (dt.replace (tzinfo = pytz.utc) .astimezone (tz)) ': http: // pytz.sourceforge.net/#localized-times-and-date-arithmetic –

+2

FFUUU! Ahh, cảm ơn bạn! Bạn đúng. Tôi là một thằng ngốc. Câu trả lời của tôi đã được cập nhật để đưa ra câu trả lời đúng, chính xác. –

4

Vượt qua pytz tzinfo đối tượng để fromtimestamp() phương pháp:

#!/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 

Lưu ý: đối tượng kết quả là múi giờ-aware: bạn có thể so sánh nó với các đối tượng datetime biết khác tức là, bạn không cần phải chuyển nó sang UTC để so sánh - bạn có thể sử dụng nó như là.

Tôi thậm chí không biết nơi +06: 55 đến từ khi singapore là +08: 00.

Bạn thấy +06:55 do cuộc gọi không hợp lệ .replace(). get_current_timezone() trả về pytz.timezone("Asia/Singapore") có chênh lệch utc thay đổi (có thể có chênh lệch utc khác tại các ngày khác nhau). Khi bạn gọi .replace() một số ngẫu nhiên (phụ thuộc vào việc thực hiện) đối tượng tzinfo được sử dụng. Vấn đề là phương pháp .replace() không cho phép pytz.timezone("Asia/Singapore") chọn đúng tzinfo cho ngày nhập.

>>> 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>] 

nghĩa là cả +06:55+0800 có giá trị (ở những ngày khác nhau) cho Singapore. Đó là lý do tại sao bạn nên sử dụng .replace() chỉ với múi giờ có chênh lệch utc không đổi như chính múi giờ utc (giá trị chênh lệch bằng 0, luôn là cho bất kỳ ngày nào).

fromtimestamp(,tz) gọi phương thức tz.fromutc() nội bộ cho phép tz để chọn mức chênh lệch chính xác cho thời gian đã cho.

Các vấn đề liên quan