Tạo một DateOperators.Timezone
cho giá trị đã cho. Giá trị này phải là một biểu thức hợp lệ phân giải thành một String
đại diện cho Mã định danh múi giờ Olson hoặc Độ lệch UTC
PyMongo sử dụng các đối tượng để biểu thị ngày và giờ trong tài liệu MongoDB. Vì MongoDB giả định rằng ngày và giờ ở dạng UTC, nên cần cẩn thận để đảm bảo rằng ngày và giờ được ghi vào cơ sở dữ liệu phản ánh UTC. Ví dụ: đoạn mã sau lưu trữ ngày giờ UTC hiện tại vào MongoDB
>>> result = db.objects.insert_one[ .. {"last_modified": datetime.datetime.utcnow[]}]
Luôn sử dụng , trả về thời gian hiện tại theo UTC, thay vì , trả về giờ địa phương hiện tại. Tránh làm điều này
>>> result = db.objects.insert_one[ .. {"last_modified": datetime.datetime.now[]}]
Giá trị của last_modified giữa hai ví dụ này rất khác nhau, mặc dù cả hai tài liệu đều được lưu trữ vào cùng một giờ địa phương. Điều này sẽ gây nhầm lẫn cho ứng dụng đọc chúng
>>> [doc['last_modified'] for doc in db.objects.find[]] [datetime.datetime[2015, 7, 8, 18, 17, 28, 324000], datetime.datetime[2015, 7, 8, 11, 17, 42, 911000]]
có một tùy chọn tz_aware cho phép các đối tượng “nhận biết”, tôi. e. , datetimes biết họ đang ở múi giờ nào. Theo mặc định, PyMongo truy xuất thời gian biểu ngây thơ
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]
Lưu ngày giờ với múi giờ
Khi lưu trữ các đối tượng chỉ định múi giờ [i. e. họ có một thuộc tính tzinfo không phải là
>>> result = db.objects.insert_one[ .. {"last_modified": datetime.datetime.now[]}]6], PyMongo sẽ tự động chuyển đổi các ngày giờ đó thành UTC
>>> import pytz >>> pacific = pytz.timezone['US/Pacific'] >>> aware_datetime = pacific.localize[ .. datetime.datetime[2002, 10, 27, 6, 0, 0]] >>> result = db.times.insert_one[{"date": aware_datetime}] >>> db.times.find_one[]['date'] datetime.datetime[2002, 10, 27, 14, 0]
Thời gian đọc
Như đã đề cập trước đó, theo mặc định, tất cả các đối tượng được trả về bởi PyMongo sẽ là ngây thơ nhưng phản ánh UTC [i. e. thời gian như được lưu trữ trong MongoDB]. Bằng cách bật tùy chọn tz_aware, các đối tượng sẽ nhận biết múi giờ và có thuộc tính tzinfo phản ánh múi giờ UTC
PyMongo 3. 1 đã giới thiệu thuộc tính tzinfo có thể được bật để tự động chuyển đổi các đối tượng sang giờ địa phương. Ví dụ: nếu chúng tôi muốn đọc tất cả thời gian trong MongoDB theo giờ Hoa Kỳ/Thái Bình Dương
>>> from bson.codec_options import CodecOptions >>> db.times.find_one[]['date'] datetime.datetime[2002, 10, 27, 14, 0] >>> aware_times = db.times.with_options[codec_options=CodecOptions[ .. tz_aware=True, .. tzinfo=pytz.timezone['US/Pacific']]] >>> result = aware_times.find_one[] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]
Xử lý ngoài phạm vi ngày giờ
Python chỉ có thể biểu thị các mốc thời gian trong phạm vi được cho phép bởi và , trong khi phạm vi các mốc thời gian được phép trong BSON có thể biểu thị bất kỳ số mili giây 64 bit nào từ kỷ nguyên Unix. Để giải quyết vấn đề này, chúng ta có thể sử dụng đối tượng, là trình bao bọc cho nội dung tích hợp
Để giải mã các giá trị ngày giờ UTC dưới dạng , nên đặt tham số
>>> [doc['last_modified'] for doc in db.objects.find[]] [datetime.datetime[2015, 7, 8, 18, 17, 28, 324000], datetime.datetime[2015, 7, 8, 11, 17, 42, 911000]]9 của nó thành một trong các tùy chọn có sẵn trong
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]0. Chúng bao gồm
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]1,
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]2,
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]3,
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]4.
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]1 là tùy chọn mặc định và có hành vi tăng
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]6 khi cố gắng giải mã một ngày nằm ngoài phạm vi.
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]2 sẽ chỉ trả về các đối tượng, bất kể ngày giờ được biểu thị nằm trong hay ngoài phạm vi
>>> from datetime import datetime >>> from bson import encode, decode >>> from bson.datetime_ms import DatetimeMS >>> from bson.codec_options import CodecOptions, DatetimeConversion >>> x = encode[{"x": datetime[1970, 1, 1]}] >>> codec_ms = CodecOptions[datetime_conversion=DatetimeConversion.DATETIME_MS] >>> decode[x, codec_options=codec_ms] {'x': DatetimeMS[0]}
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]3 sẽ trả về nếu thời gian UTC cơ bản nằm trong phạm vi hoặc nếu thời gian cơ bản không thể được biểu diễn bằng cách sử dụng Python dựng sẵn
>>> x = encode[{"x": datetime[1970, 1, 1]}] >>> y = encode[{"x": DatetimeMS[-2**62]}] >>> codec_auto = CodecOptions[datetime_conversion=DatetimeConversion.DATETIME_AUTO] >>> decode[x, codec_options=codec_auto] {'x': datetime.datetime[1970, 1, 1, 0, 0]} >>> decode[y, codec_options=codec_auto] {'x': DatetimeMS[-4611686018427387904]}
>>> result = db.tzdemo.insert_one[ .. {'date': datetime.datetime[2002, 10, 27, 6, 0, 0]}] >>> db.tzdemo.find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0] >>> options = CodecOptions[tz_aware=True] >>> db.get_collection['tzdemo', codec_options=options].find_one[]['date'] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]4 sẽ kẹp các đối tượng kết quả vào bên trong và [được cắt thành 999000 micro giây]
>>> x = encode[{"x": DatetimeMS[2**62]}] >>> y = encode[{"x": DatetimeMS[-2**62]}] >>> codec_clamp = CodecOptions[datetime_conversion=DatetimeConversion.DATETIME_CLAMP] >>> decode[x, codec_options=codec_clamp] {'x': datetime.datetime[9999, 12, 31, 23, 59, 59, 999000]} >>> decode[y, codec_options=codec_clamp] {'x': datetime.datetime[1, 1, 1, 0, 0]}
các đối tượng có hỗ trợ cho các phương thức so sánh phong phú với các trường hợp khác của. Chúng cũng có thể được chuyển đổi thành các đối tượng với
>>> from bson.codec_options import CodecOptions >>> db.times.find_one[]['date'] datetime.datetime[2002, 10, 27, 14, 0] >>> aware_times = db.times.with_options[codec_options=CodecOptions[ .. tz_aware=True, .. tzinfo=pytz.timezone['US/Pacific']]] >>> result = aware_times.find_one[] datetime.datetime[2002, 10, 27, 6, 0, tzinfo=]0