使用 python 中的日期时间进行操作

Manipulation with datetime in python

我正在 python 开发一个应用程序,我需要计算经过的时间并采取适当的措施。 我有两次默认提供和当前。我想比较与其他时间的差异,它以字符串格式提供。

我试过以下方法:

d1 = datetime.datetime(2015, 1, 21, 9, 54, 54, 340000)
print d1
d2 = datetime.datetime.now()
print d2
print d2 - d1
d3 =datetime.datetime.strptime("22:17:46.476000","%H:%M:%S.%f")
print d3

以上程序的输出是:

2015-01-21 09:54:54.340000
2015-01-21 22:28:45.070000
12:33:50.730000
1900-01-01 22:17:46.476000

这里的时差是'12:33:50.730000',我想和'22:17:46.476000'比较,是字符串。

当我尝试将字符串“22:17:46.476000”转换为时间时,我得到的年份是 1990。我只想要时间为“22:17:46.476000”。所以我可以使用 timedelta 比较这两个时间。

如何去掉 1990-01-01 年。我只想要“22:17:46.476000”。

我尝试使用时间作为 time.strptime("22:17:46.476000","%H:%M:%S.%f") 但它给出的输出为 time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=22, tm_min=17, tm_sec=46, tm_wday=0, tm_yday=1, tm_isdst=-1)

谢谢

给定日期时间 d3,您可以使用 time 方法获取时间(不带日期):

>>> d3.time()
datetime.time(22, 17, 46, 476000)

然后您可以将这次与 d2.time() 进行比较:

>>> d2.time() > d3.time()
False

或者,您可以使用 combined2 的日期和 d3 的时间构建日期时间:

import datetime as DT
d1 = DT.datetime(2015, 1, 21, 9, 54, 54, 340000)
d2 = DT.datetime.now()
d3 = DT.datetime.strptime("22:17:46.476000","%H:%M:%S.%f")
d3 = DT.datetime.combine(d2.date(), d3.time())
print(d3)
# 2015-01-21 22:17:46.476000

然后您可以比较两个日期时间:d2d3。例如:

>>> d2 < d3 
True

>>> (d3-d2).total_seconds()
36664.503375

两个 datetime 之间的区别是持续时间表示为 datetime.timedelta 而不是 datetime,因此您不能使用 strftime 对其进行格式化。

与其使用 strptime 来解析 d3 的值,不如直接构建 datetime.timedelta。见 documentation for its constructor.

如果您确实需要从字符串中解析 d3,那么您可以自己解析或使用 python-dateutil 包。

就目前而言,您正在比较两个根本不同的宏伟。

当您从一个 Datetime 对象中减去另一个对象时,您会得到一个 "timedelta" 对象 - 这是一个时间段,可以用天、小时、秒或任何时间单位表示。

另一方面,日期时间对象标记特定的时间点。当您将仅时间字符串解析为 Datetime 时,由于未指定年、月或日,它们将获得默认值 1900-01-01。

因此,由于您要与间隔进行比较的值是一个时间间隔,而不是特定的时间点,因此在比较的另一方面,您应该拥有该值。

最简单的方法就是从你的解析对象中减去 1900-01-01 的午夜 - 然后你有一个 "timedelta" 对象,只有那个持续时间.但是,请注意,这是一个 hack,只要您需要解析的时间间隔大于 24 小时,它就会中断(strptime 当然不会将“30:15:...”解析为1901-01-02 的第 6 小时)

所以,您最好分开并从头开始为您的字符串构建一个 timedelta 对象:

hour, min, sec = "22:17:46.476000".split(":")
d3 = datetime.timedelta(hours=int(hour), minutes=int(minutes), seconds=float(sec))

如果我没理解错的话,22:17:46.476000 代表的不是时间而是时间增量(因为您想将它与另一个时间增量进行比较)。

如果是这样,您真正需要的是从您的字符串构造一个 datetime.timedelta 对象。不幸的是,似乎没有内置的方法可以做到这一点,但是,here您可能会找到一些食谱。