Có những lúc bạn cần thu thập thời gian từ người dùng mà không cần thu thập ngày được liên kết. Ví dụ: nếu người dùng định cấu hình sự kiện lặp lại chạy hàng ngày cùng một lúc. Django của TimeField
không chơi với múi giờ mặc dù. Tuy nhiên, trong trường hợp cụ thể này (và có lẽ bất cứ khi nào bạn ghi lại thời gian một mình), múi giờ là một yếu tố quan trọng. Vì vậy, làm thế nào để bạn lưu trữ một thời gian nhận thức múi giờ?Làm thế nào để làm cho TimeField nhận biết múi giờ?
Trả lời
Câu trả lời là bạn không. Trong một thời gian để nhận biết múi giờ, nó phải có một ngày liên kết với nó. Hãy suy nghĩ về tiết kiệm ánh sáng ban ngày ... Giải pháp của tôi cho điều này là sử dụng một DateTimeField
trên mô hình và ghi đè lên các hình thức như sau:
# Model
class MyModel(models.Model):
time_of_day = models.DateTimeField()
# Form Fields
from django.forms.util import from_current_timezone
from django.forms.util import to_current_timezone
from django.utils import timezone
class TzAwareTimeField(forms.fields.TimeField):
def prepare_value(self, value):
if isinstance(value, datetime.datetime):
value = to_current_timezone(value).time()
return super(TzAwareTimeField, self).prepare_value(value)
def clean(self, value):
value = super(TzAwareTimeField, self).to_python(value)
dt = to_current_timezone(timezone.now())
return dt.replace(
hour=value.hour, minute=value.minute,
second=value.second, microsecond=value.microsecond)
# Forms
class MyForm(forms.ModelForm):
time_of_day = TzAwareTimeField()
Đây là chưa được kiểm tra và không đầy đủ:
class TimeFieldWithZone(TimeField):
def db_type(self, connection):
if (connection.settings_dict['ENGINE'] ==
'django.db.backends.postgresql_psycopg2'):
return 'time with time zone'
raise Exception('Unsupported database type')
def get_db_prep_value(self, value, *args, **kwargs):
try:
return super(TimeFieldWithZone, self).get_db_prep_value(
value, *args, **kwargs)
except ValueError:
return six.text_type(value)
này sẽ sử dụng Postgaty 'time with time zone
kiểu dữ liệu. Nó sẽ phá vỡ nếu bạn vượt qua nó một chuỗi trong định dạng 'HH: MM: SS.mmmmmm + HH: MM' và sử dụng auto_now sẽ cố gắng để tiết kiệm một thời gian ngây thơ (không chắc chắn nếu đó ném một lỗi).
chỉnh sửa
Trong mã phụ trợ chung, ngoại lệ được ném nếu bạn thử chèn thời gian với múi giờ khác với UTC.
chỉnh sửa 2
tôi đã thêm một cập nhật get_db_prep_value
để chuyển đổi một quy time
với múi giờ vào một chuỗi, nhưng nó chỉ hoạt động nếu múi giờ cung cấp kết quả đầu ra một utc bù đắp (có thể mơ hồ mà không có một ngày).
Có vẻ như time with time zone
là một chút gây hiểu lầm ... Theo như tôi có thể nói, nó thực sự lưu trữ thời gian có chênh lệch UTC và KHÔNG phải là múi giờ. Vì vậy sẽ rất khó để lấy giá trị trả lại, thêm ngày lịch và lấy lại thời gian thích hợp liên quan đến thời gian tiết kiệm ánh sáng ban ngày.
- 1. Làm cách nào để kết hợp ngày và giờ nhận biết múi giờ bằng Python?
- 2. Làm thế nào để làm múi giờ trong ASP.NET MVC?
- 3. Làm cách nào để bạn nhận biết múi giờ của Django-admin?
- 4. iOS - Làm thế nào để nhận được bù đắp thô cho múi giờ?
- 5. Nhận ngày giờ cho múi giờ khác Bất kể múi giờ địa phương
- 6. Làm thế nào để bạn chuyển đổi ngày/giờ từ một múi giờ này sang múi giờ khác trong R?
- 7. Làm cách nào để nối thêm vào một khung dữ liệu với cột dấu thời gian nhận biết múi giờ?
- 8. Làm cách nào để thay đổi múi giờ trong JavaScript?
- 9. Làm thế nào để chuyển đổi một ngày giờ thành múi giờ cụ thể trong C#?
- 10. Làm thế nào để thay đổi múi giờ cho một ứng dụng asp.net
- 11. Làm thế nào để làm truy vấn với các thiết lập múi giờ trong MongoDB
- 12. Làm thế nào để thiết lập múi giờ cho Postgres 9.4 vĩnh viễn
- 13. Làm cách nào để quản lý múi giờ trong Sitecore?
- 14. Múi giờ cho Firebase.ServerValue.TIMESTAMP
- 15. Làm cách nào để bạn đặt múi giờ trong Crashlytics?
- 16. Nhận múi giờ từ DateTime
- 17. Thời gian Joda - Nhận tên múi giờ?
- 18. Nhận chênh lệch múi giờ giữa hai múi giờ trong một thời hạn nhất định
- 19. Làm thế nào để lấy bù đắp múi giờ từ GMT + 0 trong php?
- 20. Làm thế nào để làm cho IntelliJ biết FIXME?
- 21. Làm cách nào để đặt Múi giờ cho mỗi chủ đề?
- 22. Làm thế nào để chèn datetime với múi giờ để SQLite?
- 23. Cách nhận múi giờ của người dùng?
- 24. Cách nhận múi giờ từ mã zip?
- 25. Làm thế nào tôi có thể chuyển đổi múi giờ của windows thành múi giờ mà pytz hiểu được?
- 26. Làm thế nào để mô hình hóa một TimeField ở Django?
- 27. Python: Làm thế nào để chuyển đổi unixtimestamp và múi giờ thành đối tượng datetime?
- 28. Làm thế nào để giả lập múi giờ của trình duyệt?
- 29. Làm thế nào để có được một danh sách các múi giờ trong ruby?
- 30. Làm thế nào để đối phó với múi giờ giữa máy chủ và máy khách?
Tuyên bố mở của bạn (và hành vi của Django) không nhất quán với cách Python xử lý các đối tượng 'thời gian'. Một đối tượng 'time' của Python có thể có trường' tzinfo', cho phép đối tượng 'time' nhận biết múi giờ không có ngày liên quan, mà _is_ có ích trong một số trường hợp, như khi ngày được lưu ở nơi khác. Tôi chỉ gặp vấn đề này với 'open_time' và' close_time' 'TimeField's trên mô hình' Day' ở Django. Những thời điểm đó lý tưởng là nhận thức về múi giờ, nhưng không thể vì Django không ủng hộ điều đó. – jbg
Đây là cũ, nhưng vẫn hữu ích, vì vậy tôi muốn chỉ ra rằng tôi nghĩ rằng bạn cần phải quấn giá trị trả về của phương thức 'clean' trong' from_current_timezone'. –