2012-02-26 38 views
9

Tôi đang tạo biểu mẫu ở Django. Tôi phải đặt một trường kiểu đầu vào, chỉ lưu trữ múi giờ trong cơ sở dữ liệu (mà sẽ được chọn bởi người dùng từ danh sách thả xuống ở dạng). Tôi không thể tìm ra cách tiếp cận nào để tạo ra mô hình múi giờ này và cách nó sẽ trả về giờ địa phương theo múi giờ đã lưu. Tôi chọn lĩnh vực sau đây nhưng nó cũng lưu giờ phút và giây cũngtiết kiệm múi giờ trong Mô hình Django

timestamp = models.DateTimeField() 

danh sách thả xuống nên theo hình thức: ... giờ 5: 30 giờ 6: 00 ... và vv trên.

Trả lời

11

Cả django lẫn python đều không cung cấp bộ múi giờ để bạn sử dụng.

Đối với điều đó, bạn sẽ cần thêm mô-đun như pytz. Bạn có thể nhận danh sách tất cả các múi giờ như sau:

>>> import pytz 
>>> pytz.all_timezones ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', 
'Africa/Asmera'.... 

Bạn có thể lưu trữ tên múi giờ trong CharField.

Nhân tiện, việc chọn múi giờ theo "GMT +6: 00" không phải là một ý tưởng hay. Ví dụ, EST thường là 5 giờ sau GMT, nhưng trong vòng 2 tuần xung quanh thay đổi thời gian tiết kiệm ánh sáng ban ngày, chênh lệch là khác nhau. Ngoài ra, tại một số thời điểm trong năm, một người nào đó ở Queensland và một người ở New South Wales đều có cùng khoản bù trừ GMT, nhưng vì NSW có DST và Queensland thì không, trong nửa năm số giờ GMT của họ khác nhau. Cách an toàn duy nhất để liệt kê múi giờ là liệt kê múi giờ địa lý thực tế.

+0

Tôi muốn tiến hành với ứng dụng của tôi ở một nơi nào đó khi anh/cô ấy chạy ứng dụng này phải có pytz trong môi trường đang chạy của nó? –

4

Cách tôi thực hiện việc này là sử dụng tên múi giờ hợp lệ của pytz. Tôi điều chỉnh danh sách của tôi để chỉ phản ánh những cái tôi cần, tức là

TIMEZONES = (
    'Canada/Atlantic', 
    'Canada/Central', 
    'Canada/Eastern', 
    'Canada/Mountain', 
    'Canada/Pacific', 
) 

sau đó tôi có một lớp trí mà đặt múi giờ như một Dòng Char như vậy:

class Location(models.Model): 
    .... 
    time_zone = models.CharField(max_length=100, blank=True, null=True, choices=TIMEZONES) # 64 min 
    .... 

Thông báo tôi đặt trống & rỗng thành True để tạo trường tùy chọn. Hãy xem django-timezone-field fields.py để biết thêm ý tưởng.

Để sử dụng điều này trong mã của tôi với pytz, tôi nhập múi giờ:

from pytz import timezone 
import datetime 
from locations.models import Location # my object that has the time_zone field 
loc = Location.objects.get(pk=1) #get existing location or your object that has time_zone field 
utc = pytz.utc 
some_utc_date = datetime.datetime(2002, 10, 27, 6, 0, 0).replace(tzinfo=utc) #tz aware 
some_date.astimezone(timezone(loc.time_zone)) 

Thay datetime.datetime (2002, 10, 27, 6, 0, 0) với lĩnh vực datetime tương ứng với vị trí của bạn hoặc đối tượng cụ thể có trường time_zone. Trong trường hợp của tôi, tôi lưu trữ tất cả các trường ngày tháng của tôi theo định dạng UTC trong một bộ sưu tập MongoDB. Khi tôi lấy dữ liệu và muốn tạo đầu ra có thể đọc được của con người, tôi sử dụng phương thức trên để hiển thị ngày trong đầu ra. Bạn cũng có thể tạo thẻ tùy chỉnh để xử lý thẻ này trong các mẫu. Xem tài liệu pytz để biết thêm chi tiết.

0

Tôi nghĩ rằng câu trả lời ở trên đều rất đẹp và chính xác, nhưng tôi leve tôi đây là một ví dụ đơn giản ...

class UserProfile(models.Model): 

    import pytz 
    TIMEZONES = tuple(zip(pytz.all_timezones, pytz.all_timezones)) 

    # ... 
    timezone = models.CharField(max_length=32, choices=TIMEZONES, 
    default='UTC') 
# ... 
Các vấn đề liên quan