2009-06-30 38 views
15

Django xử lý trường hợp múi giờ khác nhau như thế nào cho mỗi người dùng? Lý tưởng nhất là tôi muốn chạy máy chủ theo múi giờ UTC (ví dụ, trong settings.py đặt TIME_ZONE = "UTC") để tất cả các datetimes được lưu trữ trong cơ sở dữ liệu như UTC. Những thứ như this khiến tôi sợ hãi, đó là lý do tại sao tôi thích UTC ở mọi nơi.Django với cài đặt múi giờ hệ thống so với múi giờ cá nhân của người dùng

Nhưng sẽ khó khăn như thế nào để lưu trữ múi giờ cho từng người dùng và vẫn sử dụng định dạng ngày giờ và định dạng mô hình chuẩn django chuẩn. Tôi có dự đoán phải viết mã xử lý ngày ở mọi nơi để chuyển đổi ngày thành múi giờ của người dùng và quay lại UTC lần nữa không?

Tôi vẫn đang đi qua hướng dẫn django nhưng tôi biết bao nhiêu đau nó có thể được để đối phó với múi giờ của người dùng trong một số khuôn khổ khác giả định múi giờ hệ thống ở khắp mọi nơi vì vậy tôi nghĩ rằng tôi muốn hỏi bây giờ.

Nghiên cứu của tôi tại thời điểm này bao gồm tìm kiếm tài liệu django và chỉ tìm kiếm one reference đến múi giờ.


bổ sung:

Trả lời

7

Cập nhật, tháng 1 năm 2013: Django 1.4 hiện có time zone support !!


Cũ câu trả lời cho lý do lịch sử:

tôi sẽ được làm việc về vấn đề này bản thân mình cho ứng dụng của tôi. Cách tiếp cận đầu tiên của tôi cho vấn đề này sẽ là đi với lời khuyên của nhà phát triển cốt lõi django của Malcom Tredinnick trong this django-user's post. Bạn có thể muốn lưu trữ cài đặt múi giờ của người dùng trong hồ sơ người dùng của họ.

Tôi cũng rất khuyến khích bạn xem xét pytz module, điều này làm cho múi giờ ít đau đớn hơn. Đối với giao diện người dùng, tôi đã tạo "bộ chọn múi giờ" dựa trên các múi giờ chung trong pytz. Tôi có một hộp chọn cho khu vực và một hộp chọn khác cho vị trí (ví dụ: US/Central được hiển thị với hai hộp chọn). Nó làm cho việc chọn múi giờ thuận tiện hơn là lội qua danh sách 400 lựa chọn.

+0

Thay vì nhận đầu vào múi giờ của người dùng trong hộp chọn, tôi nghĩ tốt hơn là tự động làm cho ứng dụng trở thành ứng dụng, giống như Geo IP e.t.c. để đoán quốc gia/thành phố của người dùng và sử dụng múi giờ thích hợp cho phù hợp. Bạn có thấy bất kỳ vấn đề nào trong đó không? – Hafiz

+1

@ Hafiz, nếu bạn có nguồn chính xác. Nhưng đôi khi người dùng có thể muốn xem các sự kiện trong múi giờ khác với múi giờ hiện tại của họ. –

+0

yah đúng và trong tình huống này, tôi nghĩ chúng ta nên đoán trước nhưng nên cung cấp tùy chọn cho người dùng để chọn múi giờ nếu muốn, nếu không, hãy hiển thị dự đoán của chúng tôi. – Hafiz

1

Bạn có thể bắt đầu bằng cách xem ứng dụng django-timezones. Nó cung cấp một số trường mô hình dựa trên múi giờ (và các trường biểu mẫu tương ứng của chúng và một số trang trí), bạn có thể sử dụng ít nhất lưu trữ giá trị múi giờ khác nhau cho mỗi người dùng (nếu không có gì khác).

+0

Thật đáng tiếc. Dường như xử lý múi giờ trong django sẽ khó sử dụng trừ khi tôi sử dụng mô-đun bên thứ 3 với ít tài liệu và sự cố với dấu thời gian mysql. –

+1

Xử lý múi giờ có thể khó sử dụng ở bất cứ đâu. –

+0

@ayaz: django-timezones thiếu tài liệu –

2

Không phải là một chuyên gia Django ở đây, nhưng afaik Django không có ma thuật, và tôi thậm chí không thể tưởng tượng bất kỳ ma thuật như vậy mà sẽ làm việc.

Ví dụ: bạn không phải lúc nào cũng muốn tiết kiệm thời gian bằng UTC. Trong một ứng dụng lịch, ví dụ, bạn muốn lưu datetime trong thời gian cục bộ mà sự kiện lịch xảy ra. Điều này có thể khác với cả máy chủ và múi giờ của người dùng. Vì vậy, có mã tự động chuyển đổi mọi datetime đã chọn thành múi giờ của máy chủ sẽ là một điều rất tệ.

Vì vậy, có, bạn sẽ phải tự mình xử lý. Tôi khuyên bạn nên lưu trữ múi giờ cho tất cả mọi thứ, và tất nhiên chạy máy chủ trong UTC, và để tất cả các datetimes tạo ra bởi các ứng dụng sử dụng UTC, và sau đó chuyển đổi chúng vào múi giờ của người dùng khi hiển thị. Nó không khó, chỉ gây phiền nhiễu để nhớ. khi nói đến datetimes được nhập bởi người sử dụng, nó phụ thuộc vào ứng dụng nếu bạn nên chuyển đổi sang UTC hay không. Tôi sẽ là một khuyến nghị chung không chuyển đổi sang UTC nhưng lưu trong múi giờ của người dùng, với thông tin về múi giờ nào.

Có, múi giờ là một vấn đề lớn. Tôi đã viết một vài bài đăng trên blog về vấn đề gây phiền nhiễu, như ở đây: http://regebro.wordpress.com/2007/12/18/python-and-time-zones-fighting-the-beast/

Cuối cùng, bạn sẽ phải tự lo vấn đề múi giờ vì không có câu trả lời đúng cho hầu hết các vấn đề.

+0

Do vấn đề với việc lưu trữ các mục nhập lịch trong UTC, tôi cho rằng bạn có nghĩa là khi bạn có các sự kiện xảy ra vào một ngày cụ thể? 05-16 Úc/Sydney "hoặc" 2009-05-15 14:00 UTC đến 2009-05-16 14:00 UTC "? :) Ngoài ra sự kỳ quặc với các sự kiện ngồi trên chuyển đổi tiết kiệm ánh sáng ban ngày (như đã đề cập trong bài đăng trên blog của bạn) –

+0

Ồ, các trường hợp cạnh. :) Không, tôi có nghĩa là lưu trữ nó như là "2009-05-15 14:00 Úc/Sydney", khi sự kiện này xảy ra ở đó. Các sự kiện cả ngày như trong ví dụ đầu tiên của bạn là một vấn đề phức tạp khác. Họ thường cần phải là thời gian ngây thơ, vì vậy chúng xảy ra từ 00:00 đến 23:59 bất kể bạn đang ở múi giờ nào. –

+0

Nhưng lưu trữ sự kiện lịch là "2009-05-15 14:00 Australia/Sydney" là ambiguos trên chuyển đổi tiết kiệm ánh sáng ban ngày, chỉ các múi giờ được xác định rõ ràng như UTC không rõ ràng. –

1

Nhìn vào ứng dụng django-timezones Tôi thấy rằng nó không hỗ trợ MySQL DBMS, vì MySQL không lưu trữ bất kỳ tham chiếu múi giờ nào trong vòng thời gian.

Vâng, tôi nghĩ rằng tôi quản lý để làm việc xung quanh điều này bằng cách giả mạo các Brosner library và sửa đổi nó để làm việc minh bạch trong các mô hình của bạn.

Ở đó, tôi đang làm điều tương tự mà hệ thống dịch django làm, vì vậy bạn có thể nhận được chuyển đổi múi giờ của người dùng duy nhất. Ở đó bạn sẽ tìm thấy một lớp Field và một số utils datetime để luôn nhận được các datetimes được chuyển đổi thành múi giờ của người dùng. Vì vậy, mỗi khi bạn thực hiện một yêu cầu và làm một truy vấn, tất cả mọi thứ sẽ được timezoned.

Give it a try!

+0

Vui lòng thêm một số tài liệu –

4

Nó không phải là khó để viết múi giờ đang nhận thức được trong django:

Tôi đã viết ứng dụng django đơn giản giúp xử lý các múi giờ vấn đề trong dự án django: https://github.com/paluh/django-tz. Nó dựa trên mã Brosner (django-timezone) nhưng có cách tiếp cận khác nhau để giải quyết vấn đề - tôi nghĩ nó thực hiện một cái gì đó tương tự như của bạn và các mệnh đề FernandoEscher.

Tất cả giá trị ngày giờ được lưu trữ trong cơ sở dữ liệu trong một múi giờ (theo thiết lập TIME_ZONE) và chuyển đổi thành giá trị thích hợp (tức là múi giờ của người dùng) được thực hiện trong mẫu và biểu mẫu (có tiện ích biểu mẫu cho trường dữ liệu chứa subwidget bổ sung Múi giờ). Mỗi chuyển đổi datetime là rõ ràng - không có phép thuật.

Ngoài ra có bộ nhớ cache cho mỗi đơn vị cho phép bạn đơn giản hóa các chuyển đổi dữ liệu này (triển khai dựa trên máy dịch thuật django i18n).

Khi bạn muốn ghi nhớ múi giờ của người dùng, bạn nên thêm trường múi giờ vào mô hình tiểu sử và viết phần mềm trung gian đơn giản (làm theo ví dụ từ tài liệu).

3

Django không xử lý gì cả, chủ yếu là do Python cũng không. Python (Guido?) Cho đến nay đã quyết định không hỗ trợ múi giờ vì mặc dù thực tế của thế giới là "more political than rational, and there is no standard suitable for every application".

Giải pháp tốt nhất cho hầu hết là không phải lo lắng về nó ban đầu và dựa vào những gì Django cung cấp theo mặc định trong tập tin settings.py TIME_ZONE = 'America/Los_Angeles' để trợ giúp sau này.

Với tình huống của bạn pytz là cách để đi (nó đã được đề cập). Bạn có thể cài đặt nó với easy_install.Tôi khuyên bạn nên chuyển đổi thời gian trên máy chủ thành UTC khi chúng được khách hàng yêu cầu và sau đó chuyển đổi thời gian UTC này thành múi giờ địa phương của người dùng trên máy khách (thông qua Javascript trong trình duyệt hoặc qua hệ điều hành iOS/Android) .

Mã máy chủ để chuyển đổi lần lưu trữ trong cơ sở dữ liệu với America/Los_Angeles múi giờ UTC trông như thế này:

>>> # Get a datetime from the database somehow and store into "x" 
>>> x = ... 
>>> 
>>> # Create an instance of the Los_Angeles timezone 
>>> la_tz = pytz.timezone(settings.TIME_ZONE) 
>>> 
>>> # Attach timezone information to the datetime from the database 
>>> x_localized = la_tz.localize(x) 
>>> 
>>> # Finally, convert the localized time to UTC 
>>> x_utc = x_localized.astimezone(pytz.utc) 

Nếu bạn gửi x_utc xuống đến một trang web, Javascript có thể chuyển nó sang hệ điều hành của người dùng Múi giờ. Nếu bạn gửi x_utc xuống iPhone, iOS có thể thực hiện tương tự, v.v .. Tôi hy vọng điều đó sẽ hữu ích.

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