原文: http://taaviburns.ca/what_you_need_to_know_about_datetimes/what_you_need_to_know_about_datetimes.pdf
译者: TheLoverZ
译注:这篇文章实在是翻译的相当吃力,因为文中的东西平时几乎不怎么接触(我都是直接用UTC),所以如果有错误请不吝指正,谢谢!
time , calendar , 显式和隐式的时间(Naive vs Aware datetimes), pytz(第10页图)
def _days_before_year(year):
y = year - 1
return y*365 + y//4 - y//100 + y//400
(第15页图)
libc 接口thread 和 os.forkstruct_timeos.environ["TZ"] 以后才有时区支持struct_time 是隐式的,但有一个 is_dst 的标志变量(flag)。time.time() 来得到当前的 POSIX 时间戳。time.gmtime(t) 来得到一个 struct_time(t == None) 则是当前的时间,或者提供一个 POSIX 时间戳。datetimes 没什么关联,除了⋯calendar.timegm(tuple) 来把一个 UTC 的 struct_time 转化为 POSIX 时间戳。time 模块中但是被拒绝了。dates , times , intervals 和 timezones 接口。threading 和 subprocess 。pytzpytz 来对应时区的改变(包括 DST 的改变)>>> datetime(2011, 11, 6, 5, 30, tzinfo=pytz.UTC)
datetime.datetime(2011, 11, 6, 5, 30, tzinfo=<UTC>)
pytz.timezone().localize() 来得到给定时区的一个显式的时间:>>> helsinki = pytz.timezone('Europe/Helsinki')
>>> helsinki.localize(datetime(2011, 11, 6, 5, 30))
datetime.datetime(2011, 11, 6, 5, 30, tzinfo=<DstTzInfo 'Europe/Helsinki' EET+2:00:00 STD>)
.localize() 设置一下:>>> toronto = pytz.timezone('America/Toronto')
>>> toronto.localize(
... # Is this EDT or EST?
... datetime(2011, 11, 6, 1, 30),
... is_dst=None)
pytz.tzinfo.AmbiguousTimeError: 2011-11-06 01:30:00
>>> toronto = pytz.timezone('America/Toronto')
>>> datetime.now(toronto)
datetime.datetime(2012, 3, 5, 16, 40, 12, 967922, tzinfo=<DstTzInfo 'America/Toronto' EST-1 day, 19:00:00 STD>)
>>> _.date()
datetime.date(2012, 3, 5)
>>> toronto = pytz.timezone('America/Toronto')
>>> datetime(2011, 6, 1, 0, 0, # summer = DST!
... tzinfo=toronto)
datetime.datetime(2011, 6, 1, 0, 0, tzinfo=<DstTzInfo 'America/Toronto' EST-1 day, 19:00:00 STD>)
>>> _.isoformat()
'2011-06-01T00:00:00-05:00'
>>> datetime(2011, 11, 6, 5, 30,
... tzinfo=helsinki)
datetime.datetime(2011, 11, 6, 5, 30, tzinfo=<DstTzInfo 'Europe/Helsinki' HMT+1:40:00 STD>)
.replace() 向一个隐式的时间添加时区:>>> datetime(2011, 11, 6, 5, 30).replace(tzinfo=helsinki)
datetime.datetime(2011, 11, 6, 5, 30, tzinfo=<DstTzInfo 'Europe/Helsinki' HMT+1:40:00 STD>)
(32页图)
CONVERT_TZ(dt,from_tz,to_tz) ,参见 这里 。AT TIME ZONE 。unixepoch , localtime , utc 。getUTC*new Date(posixTimestamp * 1000);
var posixTimestamp = Date.now()/1000;
(new Date(posixTimestamp * 1000)).getTime() / 1000 == posixTimestamp
timegm() 的实现os.environ['TZ'] = 'right/UTC'
time.tzset()
mktime 这时候和 gmtime 正好相反。_EPOCH_DATETIME = datetime(1970, 1, 1)
_SECOND = timedelta(seconds=1)
def timegm(tuple):
return (datetime(*tuple[:6]) - _EPOCH_DATETIME) // _SECOND