Ich denke, man kann ruft ein paar Methode abrasieren, wenn Sie es tun, wie folgt:
>>> from datetime import datetime
>>> datetime.now(pytz.timezone("Australia/Melbourne")) \
.replace(hour=0, minute=0, second=0, microsecond=0) \
.astimezone(pytz.utc)
ABER ... es gibt ein größeres Problem als Ästhetik in Ihrem Code: es wird das falsche Ergebnis am Tag geben der Umstellung auf oder von der Sommerzeit.
Der Grund dafür ist, dass weder die Datetime-Konstruktoren noch replace()
DST-Änderungen berücksichtigen.
Zum Beispiel:
>>> 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!
jedoch die Dokumentation für tz.localize()
Zustände:
Diese Methode verwendet werden soll Localtimes zu konstruieren, sondern als ein Tzinfo Argument in ein Datetime-Konstruktor übergeben.
So wird Ihr Problem wie so gelöst:
>>> 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
keine Garantien für Termine vor 1582, though.
nicht vergessen Millisekunde – joeforker
es scheint es ignoriert DST. Irgendwo könnte '.localize() /. Normalize()' notwendig sein. – jfs
@ J.F.Sebastian: interessant! bist du sicher? Hast du ein Beispiel? es ist durchaus möglich. – hop