import datetime as dt # idiomatic import!?
from datetime import datetime # Why not `from datetime import DateTime`?
datetime(2015, 4, 8, 19, 15)
datetime.datetime(2015, 4, 8, 19, 15)
datetime.now()
datetime.datetime(2016, 2, 1, 15, 46, 46, 635192)
now = datetime.now()
now.year
2016
now.minute
46
all the others work as well (month, day, second...)
now.date() # can also be imported from the datetime module `from datetime import date`
datetime.date(2016, 2, 1)
now.time() # can also be imported from the datetime module `from datetime import time`
datetime.time(15, 46, 46, 656856)
now.timetuple()
time.struct_time(tm_year=2016, tm_mon=2, tm_mday=1, tm_hour=15, tm_min=46, tm_sec=46, tm_wday=0, tm_yday=32, tm_isdst=-1)
datetime.fromtimestamp(1234567890) # easy!
datetime.datetime(2009, 2, 14, 0, 31, 30)
import calendar # why calendar? no idea...
calendar.timegm(now.timetuple())
1454341606
now
datetime.datetime(2016, 2, 1, 15, 46, 46, 656856)
nowts = calendar.timegm(now.timetuple())
print(nowts)
datetime.utcfromtimestamp(nowts)
1454341606
datetime.datetime(2016, 2, 1, 15, 46, 46)
datetime.fromtimestamp(nowts) # without *utc*
datetime.datetime(2016, 2, 1, 16, 46, 46)
import time
nowts = time.mktime(now.timetuple())
datetime.fromtimestamp(nowts)
datetime.datetime(2016, 2, 1, 15, 46, 46)
see http://stackoverflow.com/questions/8777753/converting-datetime-date-to-utc-timestamp-in-python and links therein
python >= 3.3:
datetime.timestamp()
now.strftime('%H:%M %d.%m.%Y') # "similar" to man strftime(3)
'15:46 01.02.2016'
datetime.strptime('22:42 07.04.2015', '%H:%M %d.%m.%Y')
datetime.datetime(2015, 4, 7, 22, 42)
a = datetime(2015, 4, 8, 19)
b = datetime(2015, 4, 8, 21)
b - a
datetime.timedelta(0, 7200)
from datetime import timedelta
timedelta(days=1)
datetime.timedelta(1)
timedelta(seconds=10)
datetime.timedelta(0, 10)
a = datetime(2015, 4, 8, 19, 15)
b = datetime(2015, 4, 8, 21, 0)
diff = b - a
datetime.now() + diff
datetime.datetime(2016, 2, 1, 17, 31, 47, 149422)
timezone
: region with uniform time e.g. (Central European Time, Mitteleuropäische Zeit, MEZ)daylight saving time
(conversion times change even more often)pytz
most widely used implementationEurope/Berlin:
# Germany
# From Markus Kuhn (1998-09-29):
# The German time zone web site by the Physikalisch-Technische
# Bundesanstalt contains DST information back to 1916.
# [See tz-link.htm for the URL.]
# From Jörg Schilling (2002-10-23):
# In 1945, Berlin was switched to Moscow Summer time (GMT+4) by
# http://www.dhm.de/lemo/html/biografien/BersarinNikolai/
# General [Nikolai] Bersarin.
# From Paul Eggert (2003-03-08):
# http://www.parlament-berlin.de/pds-fraktion.nsf/727459127c8b66ee8525662300459099/defc77cb784f180ac1256c2b0030274b/$FILE/bersarint.pdf
# says that Bersarin issued an order to use Moscow time on May 20.
# However, Moscow did not observe daylight saving in 1945, so
# this was equivalent to CEMT (GMT+3), not GMT+4.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Germany 1946 only - Apr 14 2:00s 1:00 S
Rule Germany 1946 only - Oct 7 2:00s 0 -
Rule Germany 1947 1949 - Oct Sun>=1 2:00s 0 -
# http://www.ptb.de/de/org/4/44/441/salt.htm says the following transition
# occurred at 3:00 MEZ, not the 2:00 MEZ given in Shanks & Pottenger.
# Go with the PTB.
Rule Germany 1947 only - Apr 6 3:00s 1:00 S
Rule Germany 1947 only - May 11 2:00s 2:00 M
Rule Germany 1947 only - Jun 29 3:00 1:00 S
Rule Germany 1948 only - Apr 18 2:00s 1:00 S
Rule Germany 1949 only - Apr 10 2:00s 1:00 S
Rule SovietZone 1945 only - May 24 2:00 2:00 M # Midsummer
Rule SovietZone 1945 only - Sep 24 3:00 1:00 S
Rule SovietZone 1945 only - Nov 18 2:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Berlin 0:53:28 - LMT 1893 Apr
1:00 C-Eur CE%sT 1945 May 24 2:00
1:00 SovietZone CE%sT 1946
1:00 Germany CE%sT 1980
1:00 EU CE%sT
import pytz
not entirely true: pytz uses the TZFILLE(5) locally or brings its own, uses expanded transition rules
pytz.timezone('Europe/Berlin')
<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
berlin = pytz.timezone('Europe/Berlin')
newyork = pytz.timezone('America/New_York')
zip(berlin._utc_transition_times, berlin._transition_info)
[(datetime.datetime(1, 1, 1, 0, 0), (datetime.timedelta(0, 3180), datetime.timedelta(0), 'LMT')), (datetime.datetime(1901, 12, 13, 20, 45, 52), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1916, 4, 30, 22, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1916, 9, 30, 23, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1917, 4, 16, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1917, 9, 17, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1918, 4, 15, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1918, 9, 16, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1940, 4, 1, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1942, 11, 2, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1943, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1943, 10, 4, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1944, 4, 3, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1944, 10, 2, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1945, 4, 2, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1945, 5, 24, 0, 0), (datetime.timedelta(0, 10800), datetime.timedelta(0, 7200), 'CEMT')), (datetime.datetime(1945, 9, 24, 0, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1945, 11, 18, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1945, 12, 31, 23, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1946, 4, 14, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1946, 10, 7, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1947, 4, 6, 2, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1947, 5, 11, 1, 0), (datetime.timedelta(0, 10800), datetime.timedelta(0, 7200), 'CEMT')), (datetime.datetime(1947, 6, 29, 0, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1947, 10, 5, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1948, 4, 18, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1948, 10, 3, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1949, 4, 10, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1949, 10, 2, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1979, 12, 31, 23, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1980, 4, 6, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1980, 9, 28, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1981, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1981, 9, 27, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1982, 3, 28, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1982, 9, 26, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1983, 3, 27, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1983, 9, 25, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1984, 3, 25, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1984, 9, 30, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1985, 3, 31, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1985, 9, 29, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1986, 3, 30, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1986, 9, 28, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1987, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1987, 9, 27, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1988, 3, 27, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1988, 9, 25, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1989, 3, 26, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1989, 9, 24, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1990, 3, 25, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1990, 9, 30, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1991, 3, 31, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1991, 9, 29, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1992, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1992, 9, 27, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1993, 3, 28, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1993, 9, 26, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1994, 3, 27, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1994, 9, 25, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1995, 3, 26, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1995, 9, 24, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1996, 3, 31, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1996, 10, 27, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1997, 3, 30, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1997, 10, 26, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1998, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1998, 10, 25, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(1999, 3, 28, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(1999, 10, 31, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2000, 3, 26, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2000, 10, 29, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2001, 3, 25, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2001, 10, 28, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2002, 3, 31, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2002, 10, 27, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2003, 3, 30, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2003, 10, 26, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2004, 3, 28, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2004, 10, 31, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2005, 3, 27, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2005, 10, 30, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2006, 3, 26, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2006, 10, 29, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2007, 3, 25, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2007, 10, 28, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2008, 3, 30, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2008, 10, 26, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2009, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2009, 10, 25, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2010, 3, 28, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2010, 10, 31, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2011, 3, 27, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2011, 10, 30, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2012, 3, 25, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2012, 10, 28, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2013, 3, 31, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2013, 10, 27, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2014, 3, 30, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2014, 10, 26, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2015, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2015, 10, 25, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2016, 3, 27, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2016, 10, 30, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2017, 3, 26, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2017, 10, 29, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2018, 3, 25, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2018, 10, 28, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2019, 3, 31, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2019, 10, 27, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2020, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2020, 10, 25, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2021, 3, 28, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2021, 10, 31, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2022, 3, 27, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2022, 10, 30, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2023, 3, 26, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2023, 10, 29, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2024, 3, 31, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2024, 10, 27, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2025, 3, 30, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2025, 10, 26, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2026, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2026, 10, 25, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2027, 3, 28, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2027, 10, 31, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2028, 3, 26, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2028, 10, 29, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2029, 3, 25, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2029, 10, 28, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2030, 3, 31, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2030, 10, 27, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2031, 3, 30, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2031, 10, 26, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2032, 3, 28, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2032, 10, 31, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2033, 3, 27, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2033, 10, 30, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2034, 3, 26, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2034, 10, 29, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2035, 3, 25, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2035, 10, 28, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2036, 3, 30, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2036, 10, 26, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET')), (datetime.datetime(2037, 3, 29, 1, 0), (datetime.timedelta(0, 7200), datetime.timedelta(0, 3600), 'CEST')), (datetime.datetime(2037, 10, 25, 1, 0), (datetime.timedelta(0, 3600), datetime.timedelta(0), 'CET'))]
berlin.localize(now)
datetime.datetime(2016, 2, 1, 15, 46, 46, 656856, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)
now_local = berlin.localize(now)
now_local.tzinfo
<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>
now.tzinfo is None
True
newyork.localize(now_local) # does not work
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-35-3a8cff1eaec1> in <module>() ----> 1 newyork.localize(now_local) # does not work /usr/home/cg/.virtualenvs/jupyter/lib/python2.7/site-packages/pytz/tzinfo.pyc in localize(self, dt, is_dst) 302 ''' 303 if dt.tzinfo is not None: --> 304 raise ValueError('Not naive datetime (tzinfo is already set)') 305 306 # Find the two best possibilities. ValueError: Not naive datetime (tzinfo is already set)
now_local.astimezone(newyork)
datetime.datetime(2016, 2, 1, 9, 46, 46, 656856, tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)
now_ny = now_local.astimezone(newyork)
now_ny.replace(tzinfo=None)
datetime.datetime(2016, 2, 1, 9, 46, 46, 656856)
datetime
instances¶datetime(2015, 4, 8, 20, 0, tzinfo=berlin)
datetime.datetime(2015, 4, 8, 20, 0, tzinfo=<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>)
time_local = datetime(2015, 4, 8, 20, 0, tzinfo=berlin)
time_local.astimezone(pytz.UTC) # 53 min offset!
datetime.datetime(2015, 4, 8, 19, 7, tzinfo=<UTC>)
berlin.localize(datetime(2015, 4, 8, 20, 0))
datetime.datetime(2015, 4, 8, 20, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>)
time_local.astimezone(pytz.UTC)
datetime.datetime(2015, 4, 8, 19, 7, tzinfo=<UTC>)
now - now_local # error! not a good idea anyway
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-43-9d48a0f4f21f> in <module>() ----> 1 now - now_local # error! not a good idea anyway TypeError: can't subtract offset-naive and offset-aware datetimes
In theory:
(analog to the unicode sandwich)
Problems:
Be careful:
datetime.now()
datetime.datetime(2016, 2, 1, 15, 48, 8, 270238)
datetime.utcnow()
datetime.datetime(2016, 2, 1, 14, 48, 8, 291801)
access a tzinfo object with the local timezone information
import tzlocal
tzlocal.get_localzone()
<DstTzInfo 'local' CET+1:00:00 STD>
from dateutil.rrule import rrule, MONTHLY, WE
meetings = rrule(MONTHLY, byweekday=WE(+2), byhour=19, byminute=0, count=12) # next 12 pyCologne Meetings, thanks Chris!
meetings
<dateutil.rrule.rrule at 0x80b6cd2d0>
list(meetings)
[datetime.datetime(2016, 2, 10, 19, 0, 10), datetime.datetime(2016, 3, 9, 19, 0, 10), datetime.datetime(2016, 4, 13, 19, 0, 10), datetime.datetime(2016, 5, 11, 19, 0, 10), datetime.datetime(2016, 6, 8, 19, 0, 10), datetime.datetime(2016, 7, 13, 19, 0, 10), datetime.datetime(2016, 8, 10, 19, 0, 10), datetime.datetime(2016, 9, 14, 19, 0, 10), datetime.datetime(2016, 10, 12, 19, 0, 10), datetime.datetime(2016, 11, 9, 19, 0, 10), datetime.datetime(2016, 12, 14, 19, 0, 10), datetime.datetime(2017, 1, 11, 19, 0, 10)]
from dateutil.rrule import rrulestr
now_local = berlin.localize(datetime(2015, 4, 8, 19))
list(rrulestr('FREQ=MONTHLY;COUNT=12', dtstart=now_local)) # all in DST??? this is not what we wanted...
[datetime.datetime(2015, 4, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 5, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 6, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 7, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 8, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 9, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 10, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 11, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 12, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2016, 1, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2016, 2, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2016, 3, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>)]
[dtime.astimezone(pytz.UTC).astimezone(berlin) for dtime in list(rrulestr('FREQ=MONTHLY;COUNT=12', dtstart=now_local))]
[datetime.datetime(2015, 4, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 5, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 6, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 7, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 8, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 9, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 10, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 11, 8, 18, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>), datetime.datetime(2015, 12, 8, 18, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>), datetime.datetime(2016, 1, 8, 18, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>), datetime.datetime(2016, 2, 8, 18, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>), datetime.datetime(2016, 3, 8, 18, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)]
old_tz = now_local.tzinfo
now_unlocal = now_local.replace(tzinfo=None)
[old_tz.localize(dtime) for dtime in rrulestr('FREQ=MONTHLY;COUNT=12', dtstart=now_unlocal)]
[datetime.datetime(2015, 4, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 5, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 6, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 7, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 8, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 9, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 10, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>), datetime.datetime(2015, 11, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>), datetime.datetime(2015, 12, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>), datetime.datetime(2016, 1, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>), datetime.datetime(2016, 2, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>), datetime.datetime(2016, 3, 8, 19, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)]
orig_tz = dtime.tzinfo
dtime = dtime.replace(tzinfo=None)
# do calculations here
orig_tz.localize(dtime)
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-58-7c52a5461682> in <module>() 4 # do calculations here 5 ----> 6 orig_tz.localize(dtime) AttributeError: 'NoneType' object has no attribute 'localize'
import parsedatetime
cal = parsedatetime.Calendar()
cal.parse('Tomorrow Evening')
((2016, 2, 2, 18, 0, 0, 1, 33, -1), 3)
cal.parse('Next Wednesday at noon')
((2016, 2, 10, 12, 0, 0, 2, 41, -1), 3)
cal.parse('PyBonn next Thursday 19:00 at HRZ Uni Bonn')
Better dates & times for Python
datetime
, time
, calendar
)