这取决于整数应该编码的内容。您可以将日期转换为以前某个时间的毫秒数。人们经常在 1970 年 1 月 1 日凌晨 12:00 或 1900 年等时间执行此操作,并将时间测量为从该点开始的整数毫秒数。 datetime 模块(或其他类似模块)将具有为您执行此操作的功能:例如,您可以使用 int(datetime.datetime.utcnow().timestamp())。
如果您想对年、月和日进行语义编码,一种方法是将这些组件乘以足够大的数量级值,以将它们并列在整数位内:
2012-06-13 --> 20120613 = 10,000 * (2012) + 100 * (6) + 1*(13)
def to_integer(dt_time):
return 10000*dt_time.year + 100*dt_time.month + dt_time.day
例如
In [1]: import datetime
In [2]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:def to_integer(dt_time):
: return 10000*dt_time.year + 100*dt_time.month + dt_time.day
: # Or take the appropriate chars from a string date representation.
:--
In [3]: to_integer(datetime.date(2012, 6, 13))
Out[3]: 20120613
如果您还需要分钟和秒,则只需根据需要包含更多数量级以显示数字。
我在遗留系统中经常遇到第二种方法,尤其是从遗留 SQL 数据库中提取基于日期的数据的系统。
非常糟糕。您最终会编写大量用于对齐日期、计算月份或日期偏移量的 hacky 代码,因为它们将以整数格式出现(例如,当您经过 12 月时将月份重置回 1,然后增加年份值),以及用于整数格式之间的相互转换。
除非这样的约定存在于您正在处理的 API 的深层、低级且经过全面测试的部分中,否则曾经使用过数据的每个人都可以真正依靠这种整数表示及其所有辅助函数,那么你最终会导致很多人到处重写基本的日期处理例程。
通常最好将值保留在日期上下文中,例如datetime.date,只要您可以,这样对它的操作就可以在自然的、基于日期的上下文中表达,而不是孤立的开发者个人破解成整数。