原文: 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.fork
struct_time
os.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
。pytz
pytz
来对应时区的改变(包括 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