2010-11-06 77 views
5

Tôi đang sử dụng python trên Django và Google App Engine. Tôi cũng đang sử dụng DateTimeProperty trong một trong các mô hình của mình. Thỉnh thoảng tôi muốn hiển thị ngày và giờ đó cho người dùng.Chuyển đổi ngày giờ UTC thành ngày giờ địa phương của người dùng

Tốt nhất để chuyển đổi datetime được lưu trữ trong DateTimeProperty thành ngày giờ của người dùng là gì?

Hoặc cách chính xác hơn trong việc đặt khung câu hỏi: Cách tốt nhất để nhận múi giờ của khách hàng là gì và chuyển đổi đối tượng ngày giờ trăn thành thời gian địa phương của riêng họ?

+0

thể trùng lặp : http://stackoverflow.com/questions/4065157/django-time-issues/4065236#4065236 – mouad

+0

chỉ cần tìm ra những gì chấp nhận là ... cảm ơn – speedplane

Trả lời

8

Đây là câu hỏi Python nhiều hơn GAE, trừ khi GAE có một số cơ sở hạ tầng để tạo điều kiện này (tôi đã thực hiện quét nhanh nhưng không tìm thấy bất kỳ tham chiếu nào). Về cơ bản, bạn muốn lưu trữ ngày/giờ theo múi giờ UTC (ví dụ: sử dụng datetime.datetime.utcnow) cùng với múi giờ của người dùng, bạn có thể thử trích xuất từ ​​IP người dùng (sử dụng GeoDjango, nếu có trên GAE hoặc pygeoip; bạn cần một số geolocation db như: http://www.maxmind.com/app/geolitecity) hoặc yêu cầu người dùng về nó - điều này có lợi thế là bạn có thể yêu cầu một tên múi giờ mô tả, như "Europe/Warsaw". Nếu bạn yêu cầu chỉ UTC + 2, sau đó bạn mất bất kỳ dấu hiệu của DST thay đổi.

Sau đó, bạn có thể chuyển từ utc sang múi giờ mong muốn bằng cách sử dụng ví dụ: pytz:

import pytz 
local_tz = pytz.timezone(timezone_name) 
return timestamp_utc.replace(tzinfo=pytz.utc).astimezone(local_tz).replace(tzinfo=None) 

- nơi timestamp_utc là datetime utc mà bạn muốn chuyển đổi, và TIMEZONE_NAME là đề cập đến "Châu Âu/Warsaw".

(Lưu ý rằng tôi không biết cái nào của những tác phẩm này trong GAE, nhưng ít nhất bạn sẽ biết những gì để tìm kiếm)

+0

Điều này là phức tạp hơn tôi nghĩ. Yêu cầu người dùng rõ ràng là không có câu hỏi. GeoDjango trông giống như một thư viện lớn cho tất cả các loại công cụ liên quan đến GEO, tôi chỉ muốn chuyển đổi địa chỉ IP thành các múi giờ. Ngay cả pytz có vẻ thực sự lớn. – speedplane

3

Vì vậy, tôi đã nghiên cứu nhiều hơn một chút vào này. Để làm đúng thời gian, bạn phải theo dõi một thứ giống như những gì Tomasz đã mô tả trong câu trả lời của mình. Tuy nhiên, nếu bạn sẵn sàng chấp nhận một chút kludge, bạn có thể nhận được 90% con đường ở đó với nỗ lực ít hơn nhiều.

Khi người dùng đăng nhập hoặc không có bất kỳ hành động trên trang web của bạn, bạn có thể sử dụng javascript để lấy múi giờ hiện tại của họ bù đắp và sau đó gửi nó trong yêu cầu tiếp theo của bạn:

var offset = (new Date()).getTimezoneOffset() 
$.post("post.html", "offset="offset.toString(), ...); 

Tất nhiên điều này giả định rằng người sử dụng đã đặt đúng múi giờ hiện tại của họ. Này được thảo luận trên một số trang web khác:

+0

Ah, rất hay, tôi không biết điều này. Tuy nhiên, nếu bạn phát triển, ví dụ: một CRM, sau đó bạn không thể bỏ qua sự tinh tế như DST. –

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