Tôi nghĩ bạn có thể cạo ra một vài phương pháp gọi nếu bạn làm điều đó như thế này:
>>> from datetime import datetime
>>> datetime.now(pytz.timezone("Australia/Melbourne")) \
.replace(hour=0, minute=0, second=0, microsecond=0) \
.astimezone(pytz.utc)
NHƯNG ... có một vấn đề lớn hơn thẩm mỹ trong mã của bạn: nó sẽ cho kết quả sai vào ngày của chuyển đổi đến hoặc từ Daylight Saving Time.
Lý do cho điều này là không phải các nhà xây dựng datetime cũng không phải replace()
thay đổi DST vào tài khoản.
Ví dụ:
>>> now = datetime(2012, 4, 1, 5, 0, 0, 0, tzinfo=pytz.timezone("Australia/Melbourne"))
>>> print now
2012-04-01 05:00:00+10:00
>>> print now.replace(hour=0)
2012-04-01 00:00:00+10:00 # wrong! midnight was at 2012-04-01 00:00:00+11:00
>>> print datetime(2012, 3, 1, 0, 0, 0, 0, tzinfo=tz)
2012-03-01 00:00:00+10:00 # wrong again!
Tuy nhiên, tài liệu cho tz.localize()
trạng thái:
Phương pháp này nên được sử dụng để xây dựng localtimes, thay hơn thông qua một lập luận tzinfo đến một constructor datetime.
Như vậy, vấn đề của bạn được giải quyết như sau:
>>> import pytz
>>> from datetime import datetime, date, time
>>> tz = pytz.timezone("Australia/Melbourne")
>>> the_date = date(2012, 4, 1) # use date.today() here
>>> midnight_without_tzinfo = datetime.combine(the_date, time())
>>> print midnight_without_tzinfo
2012-04-01 00:00:00
>>> midnight_with_tzinfo = tz.localize(midnight_without_tzinfo)
>>> print midnight_with_tzinfo
2012-04-01 00:00:00+11:00
>>> print midnight_with_tzinfo.astimezone(pytz.utc)
2012-03-31 13:00:00+00:00
Không đảm bảo cho những ngày trước năm 1582, mặc dù.
đừng quên mili giây – joeforker
có vẻ như nó bỏ qua DST. Một nơi nào đó '.localize() /. Normalize()' có thể là cần thiết. – jfs
@ J.F.Sebastian: thú vị! bạn có chắc không? bạn có một ví dụ? nó hoàn toàn có thể. – hop