如何在 python 中将日期时间转换为整数

How to convert datetime to integer in python

如何将 YYYY-MM-DD hh:mm:ss 格式转换为 python 中的整数? 例如 2014-02-12 20:51:14 -> 为整数。

我只知道如何转换hh:mm:ss但不会yyyy-mm-dd hh:mm:ss

def time_to_num(time_str):
    hh, mm , ss = map(int, time_str.split(':'))
    return ss + 60*(mm + 60*hh)

这取决于整数应该编码的内容。您可以将日期转换为之前某个时间的毫秒数。人们经常这样做,将 12:00 am January 1 1970 或 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,尽可能长时间,以便在基于日期的自然上下文中表达对它的操作,而不是某个单独的开发人员对整数的个人破解。

我想我有一个捷径:

# Importing datetime.
from datetime import datetime

# Creating a datetime object so we can test.
a = datetime.now()

# Converting a to string in the desired format (YYYYMMDD) using strftime
# and then to int.
a = int(a.strftime('%Y%m%d'))

将日期时间转换为整数时,必须牢记十位、百位和千位....例如 “2018-11-03”必须像 20181103 in int 为此你必须 2018*10000 + 100* 11 + 3

同样的另一个例子, “2018-11-03 10:02:05”必须类似于 20181103100205 in

解释码

dt = datetime(2018,11,3,10,2,5)
print (dt)

#print (dt.timestamp()) # unix representation ... not useful when converting to int

print (dt.strftime("%Y-%m-%d"))
print (dt.year*10000 + dt.month* 100  + dt.day)
print (int(dt.strftime("%Y%m%d")))

print (dt.strftime("%Y-%m-%d %H:%M:%S"))
print (dt.year*10000000000 + dt.month* 100000000 +dt.day * 1000000 + dt.hour*10000  +  dt.minute*100 + dt.second)
print (int(dt.strftime("%Y%m%d%H%M%S")))

一般函数

为避免手动使用以下功能

def datetime_to_int(dt):
    return int(dt.strftime("%Y%m%d%H%M%S"))

这在一个例子中可以用来提供数据库键,我有时使用而不是使用 AUTOINCREMENT 选项。

import datetime 

dt = datetime.datetime.now()
seq = int(dt.strftime("%Y%m%d%H%M%S"))

虽然其他答案集中在 人类可读的整数 表示 int(mydate.strftime("%Y%m%d%H%M%S")),但我更喜欢 bash date 之类的东西s “自纪元(1970-01-01 UTC)以来的秒数”。作为参考,您可以使用以下 bash 命令得到 1392234674 作为结果:

date +%s --date="2014-02-12 20:51:14"

一样,只是一个简单的整数作为表示是明确无误的,而且更容易处理和解析,尤其是在编程方面。加上转换是一种简单的单线方式。

要在 python 中做同样的事情,您可以使用

#mydate = datetime.now() #If you want the current time instead
mydate = datetime(2014,2,12,20,51,14) #your date
result = (mydate - datetime(1970, 1, 1)).total_seconds()
#or: result = (mydate - datetime(1970, 1, 1)) / timedelta(seconds=1)

如果您不需要 POSIX 时间戳的兼容性,您也可以删除 - datetime(1970, 1, 1)

这里是一个简单的日期->二次转换工具:

def time_to_int(dateobj):
    total = int(dateobj.strftime('%S'))
    total += int(dateobj.strftime('%M')) * 60
    total += int(dateobj.strftime('%H')) * 60 * 60
    total += (int(dateobj.strftime('%j')) - 1) * 60 * 60 * 24
    total += (int(dateobj.strftime('%Y')) - 1970) * 60 * 60 * 24 * 365
    return total

(实际上是一个 UNIX 时间戳计算器)

使用示例:

from datetime import datetime
x = datetime(1970, 1, 1)
time_to_int(x)

Output: 0

x = datetime(2021, 12, 31)
time_to_int(x)

Output: 1639785600

x = datetime(2022, 1, 1)
time_to_int(x)

Output: 1639872000

x = datetime(2022, 1, 2)
time_to_int(x)

Output: 1639958400