1

在 $PYTHONHOME/lib/python2.7/calendar.py 中,timegm 定义为

EPOCH = 1970
_EPOCH_ORD = datetime.date(EPOCH, 1, 1).toordinal()


def timegm(tuple):
    """Unrelated but handy function to calculate Unix timestamp from GMT."""
    year, month, day, hour, minute, second = tuple[:6]
    days = datetime.date(year, month, 1).toordinal() - _EPOCH_ORD + day - 1
    hours = days*24 + hour
    minutes = hours*60 + minute
    seconds = minutes*60 + second
    return seconds

有什么理由不计算天数:

days = datetime.date(year, month, day).toordinal() - _EPOCH_ORD

谁能想到前一个表达式会中断的情况?

4

1 回答 1

1
datetime.date(year, month, day).toordinal()

“范围检查” day(结合年和月)是有效datetime.date.

datetime.date(year, month, 1)不 - 或者更确切地说,只需要year并且month是有效的。

显然,一些用户正在利用这个“功能”(不检查当天),并且为了向后兼容(与 Python2.2!),开发人员保留了这种行为。请参阅 Raymond Hettinger 在提交 #27881中的评论。

PS。calendar.py您可以通过运行找到更改此行的提交

hg blame cpython/Lib/calendar.py 

(前提是你有hg cloneCPython 存储库)。

10940: def timegm(tuple):
11691:     """Unrelated but handy function to calculate Unix timestamp from GMT."""
11691:     year, month, day, hour, minute, second = tuple[:6]
27881:     days = datetime.date(year, month, 1).toordinal() - _EPOCH_ORD + day - 1

然后,要查找有关 commit #27881 的更多信息,您可以搜索http://hg.python.org/

于 2012-09-06T18:44:59.493 回答