Múi giờ MongoDB

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

MongoDB sử dụng múi giờ nào?

Tổng quan. MongoDB lưu trữ thời gian trong UTC theo mặc định và sẽ chuyển đổi mọi biểu diễn giờ địa phương thành dạng này. Các ứng dụng phải vận hành hoặc báo cáo về một số giá trị thời gian địa phương chưa sửa đổi có thể lưu trữ múi giờ cùng với dấu thời gian UTC và tính toán thời gian địa phương ban đầu trong logic ứng dụng của chúng.

Làm cách nào để lưu trữ thời gian UTC trong MongoDB?

new Date(" chỉ định ngày giờ theo múi giờ địa phương của khách hàng và trả về ISODate với ngày giờ được chỉ định trong UTC. ngày mới("

Tôi có nên sử dụng múi giờ trong cơ sở dữ liệu không?

Cơ sở dữ liệu sẽ chuyển đổi bất kỳ ngày giờ nào thành kỷ nguyên UTC để lưu trữ nội bộ. Tuy nhiên, một số cơ sở dữ liệu có thể cho phép lưu trữ thông tin múi giờ. Nếu đúng như vậy, bạn nên chuyển đổi tất cả các ngày thành UTC trước khi lưu trữ . Không sử dụng múi giờ địa phương.

Cơ sở dữ liệu sử dụng múi giờ nào?