简体   繁体   English

如何在python中找到两个日期时间对象之间的时差?

[英]How do I find the time difference between two datetime objects in python?

如何判断两个datetime对象之间的时差(以分钟为单位)?

>>> import datetime
>>> first_time = datetime.datetime.now()
>>> later_time = datetime.datetime.now()
>>> difference = later_time - first_time
datetime.timedelta(0, 8, 562000)
>>> seconds_in_day = 24 * 60 * 60
>>> divmod(difference.days * seconds_in_day + difference.seconds, 60)
(0, 8)      # 0 minutes, 8 seconds

Subtracting the later time from the first time difference = later_time - first_time creates a datetime object that only holds the difference.从第一个时间difference = later_time - first_time减去以后的时间difference = later_time - first_time创建一个仅保留差异的日期时间对象。 In the example above it is 0 minutes, 8 seconds and 562000 microseconds.在上面的示例中,它是 0 分 8 秒和 562000 微秒。

Using datetime example使用日期时间示例

>>> from datetime import datetime
>>> then = datetime(2012, 3, 5, 23, 8, 15)        # Random date in the past
>>> now  = datetime.now()                         # Now
>>> duration = now - then                         # For build-in functions
>>> duration_in_s = duration.total_seconds()      # Total number of seconds between dates

Duration in years年限

>>> years = divmod(duration_in_s, 31536000)[0]    # Seconds in a year=365*24*60*60 = 31536000.

Duration in days持续时间(天)

>>> days  = duration.days                         # Build-in datetime function
>>> days  = divmod(duration_in_s, 86400)[0]       # Seconds in a day = 86400

Duration in hours持续时间(小时)

>>> hours = divmod(duration_in_s, 3600)[0]        # Seconds in an hour = 3600

Duration in minutes持续时间(分钟)

>>> minutes = divmod(duration_in_s, 60)[0]        # Seconds in a minute = 60

Duration in seconds持续时间(以秒为单位)

[!] See warning about using duration in seconds in the bottom of this post [!] 请参阅本文底部有关以秒为单位使用持续时间的警告

>>> seconds = duration.seconds                    # Build-in datetime function
>>> seconds = duration_in_s

Duration in microseconds以微秒为单位的持续时间

[!] See warning about using duration in microseconds in the bottom of this post [!] 请参阅本文底部有关使用以微秒为单位的持续时间的警告

>>> microseconds = duration.microseconds          # Build-in datetime function

Total duration between the two dates两个日期之间的总持续时间

>>> days    = divmod(duration_in_s, 86400)        # Get days (without [0]!)
>>> hours   = divmod(days[1], 3600)               # Use remainder of days to calc hours
>>> minutes = divmod(hours[1], 60)                # Use remainder of hours to calc minutes
>>> seconds = divmod(minutes[1], 1)               # Use remainder of minutes to calc seconds
>>> print("Time between dates: %d days, %d hours, %d minutes and %d seconds" % (days[0], hours[0], minutes[0], seconds[0]))

or simply:或者干脆:

>>> print(now - then)

Edit 2019 Since this answer has gained traction, I'll add a function, which might simplify the usage for some编辑 2019由于此答案已引起关注,我将添加一个功能,该功能可能会简化某些人的使用

from datetime import datetime

def getDuration(then, now = datetime.now(), interval = "default"):

    # Returns a duration as specified by variable interval
    # Functions, except totalDuration, returns [quotient, remainder]

    duration = now - then # For build-in functions
    duration_in_s = duration.total_seconds() 
    
    def years():
      return divmod(duration_in_s, 31536000) # Seconds in a year=31536000.

    def days(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 86400) # Seconds in a day = 86400

    def hours(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 3600) # Seconds in an hour = 3600

    def minutes(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 60) # Seconds in a minute = 60

    def seconds(seconds = None):
      if seconds != None:
        return divmod(seconds, 1)   
      return duration_in_s

    def totalDuration():
        y = years()
        d = days(y[1]) # Use remainder to calculate next variable
        h = hours(d[1])
        m = minutes(h[1])
        s = seconds(m[1])

        return "Time between dates: {} years, {} days, {} hours, {} minutes and {} seconds".format(int(y[0]), int(d[0]), int(h[0]), int(m[0]), int(s[0]))

    return {
        'years': int(years()[0]),
        'days': int(days()[0]),
        'hours': int(hours()[0]),
        'minutes': int(minutes()[0]),
        'seconds': int(seconds()),
        'default': totalDuration()
    }[interval]

# Example usage
then = datetime(2012, 3, 5, 23, 8, 15)
now = datetime.now()

print(getDuration(then)) # E.g. Time between dates: 7 years, 208 days, 21 hours, 19 minutes and 15 seconds
print(getDuration(then, now, 'years'))      # Prints duration in years
print(getDuration(then, now, 'days'))       #                    days
print(getDuration(then, now, 'hours'))      #                    hours
print(getDuration(then, now, 'minutes'))    #                    minutes
print(getDuration(then, now, 'seconds'))    #                    seconds

Warning: Caveat about built-in .seconds and .microseconds警告:关于内置 .seconds 和 .microseconds 的警告
datetime.seconds and datetime.microseconds are capped to [0,86400) and [0,10^6) respectively. datetime.secondsdatetime.microseconds的上限分别为 [0,86400) 和 [0,10^6)。

They should be used carefully if timedelta is bigger than the max returned value.如果 timedelta 大于最大返回值,则应谨慎使用它们。

Examples:例子:

end is 1h and 200μs after start : endstart后 1 小时和 200 微秒:

>>> start = datetime(2020,12,31,22,0,0,500)
>>> end = datetime(2020,12,31,23,0,0,700)
>>> delta = end - start
>>> delta.microseconds
RESULT: 200
EXPECTED: 3600000200

end is 1d and 1h after start : endstart后的 1d 和 1h:

>>> start = datetime(2020,12,30,22,0,0)
>>> end = datetime(2020,12,31,23,0,0)
>>> delta = end - start
>>> delta.seconds
RESULT: 3600
EXPECTED: 90000

New at Python 2.7 is the timedelta instance method .total_seconds() . Python 2.7 的新功能是timedelta实例方法.total_seconds() From the Python docs, this is equivalent to (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 .从 Python 文档中,这相当于(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

Reference: http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds参考: http : //docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds

>>> import datetime
>>> time1 = datetime.datetime.now()
>>> time2 = datetime.datetime.now() # waited a few minutes before pressing enter
>>> elapsedTime = time2 - time1
>>> elapsedTime
datetime.timedelta(0, 125, 749430)
>>> divmod(elapsedTime.total_seconds(), 60)
(2.0, 5.749430000000004) # divmod returns quotient and remainder
# 2 minutes, 5.74943 seconds

Just subtract one from the other.只需从另一个中减去一个。 You get a timedelta object with the difference.您将获得一个具有差异的timedelta对象。

>>> import datetime
>>> d1 = datetime.datetime.now()
>>> d2 = datetime.datetime.now() # after a 5-second or so pause
>>> d2 - d1
datetime.timedelta(0, 5, 203000)

You can convert dd.days , dd.seconds and dd.microseconds to minutes.您可以将dd.daysdd.secondsdd.microseconds转换为分钟。

If a , b are datetime objects then to find the time difference between them in Python 3:如果ab是日期时间对象,那么在 Python 3 中找到它们之间的时差:

from datetime import timedelta

time_difference = a - b
time_difference_in_minutes = time_difference / timedelta(minutes=1)

On earlier Python versions:在早期的 Python 版本上:

time_difference_in_minutes = time_difference.total_seconds() / 60

If a , b are naive datetime objects such as returned by datetime.now() then the result may be wrong if the objects represent local time with different UTC offsets eg, around DST transitions or for past/future dates.如果a , b是原始日期时间对象,例如由datetime.now()返回,那么如果对象表示具有不同 UTC 偏移量的本地时间,例如,围绕 DST 转换或过去/未来日期,则结果可能是错误的。 More details: Find if 24 hrs have passed between datetimes - Python .更多详细信息:查找日期时间之间是否过去了 24 小时 - Python

To get reliable results, use UTC time or timezone-aware datetime objects.要获得可靠的结果,请使用 UTC 时间或时区感知日期时间对象。

Use divmod:使用divmod:

now = int(time.time()) # epoch seconds
then = now - 90000 # some time in the past

d = divmod(now-then,86400)  # days
h = divmod(d[1],3600)  # hours
m = divmod(h[1],60)  # minutes
s = m[1]  # seconds

print '%d days, %d hours, %d minutes, %d seconds' % (d[0],h[0],m[0],s)

This is how I get the number of hours that elapsed between two datetime.datetime objects:这就是我如何获得两个 datetime.datetime 对象之间经过的小时数:

before = datetime.datetime.now()
after  = datetime.datetime.now()
hours  = math.floor(((after - before).seconds) / 3600)

Just thought it might be useful to mention formatting as well in regards to timedelta.只是认为提及有关 timedelta 的格式可能会很有用。 strptime() parses a string representing a time according to a format. strptime() 根据格式解析表示时间的字符串。

from datetime import datetime

datetimeFormat = '%Y/%m/%d %H:%M:%S.%f'    
time1 = '2016/03/16 10:01:28.585'
time2 = '2016/03/16 09:56:28.067'  
time_dif = datetime.strptime(time1, datetimeFormat) - datetime.strptime(time2,datetimeFormat)
print(time_dif)

This will output: 0:05:00.518000这将输出:0:05:00.518000

To just find the number of days: timedelta has a 'days' attribute.只查找天数:timedelta 有一个“天”属性。 You can simply query that.您可以简单地查询。

>>>from datetime import datetime, timedelta
>>>d1 = datetime(2015, 9, 12, 13, 9, 45)
>>>d2 = datetime(2015, 8, 29, 21, 10, 12)
>>>d3 = d1- d2
>>>print d3
13 days, 15:59:33
>>>print d3.days
13

I use somethign like this :我使用这样的东西:

from datetime import datetime

def check_time_difference(t1: datetime, t2: datetime):
    t1_date = datetime(
        t1.year,
        t1.month,
        t1.day,
        t1.hour,
        t1.minute,
        t1.second)

    t2_date = datetime(
        t2.year,
        t2.month,
        t2.day,
        t2.hour,
        t2.minute,
        t2.second)

    t_elapsed = t1_date - t2_date

    return t_elapsed

# usage 
f = "%Y-%m-%d %H:%M:%S+01:00"
t1 = datetime.strptime("2018-03-07 22:56:57+01:00", f)
t2 = datetime.strptime("2018-03-07 22:48:05+01:00", f)
elapsed_time = check_time_difference(t1, t2)

print(elapsed_time)
#return : 0:08:52

This will give the difference in seconds (then just divide by 60 to get minutes):这将给出以秒为单位的差异(然后除以 60 得到分钟):

import time
import datetime

t_start = datetime.datetime.now()

time.sleep(10)

t_end = datetime.datetime.now()
elapsedTime = (t_end - t_start )

print(elapsedTime.total_seconds())

outputs:输出:

10.009222

This is the simplest way in my opinion, and you don't need to worry about precision or overflow.这是我认为最简单的方法,您无需担心精度或溢出。

For instance, using elapsedTime.seconds you lose a lot of precision (it returns an integer).例如,使用elapsedTime.seconds会损失很多精度(它返回一个整数)。 Also, elapsedTime.microseconds is capped at 10^6, as this answer pointed out.此外,正如这个答案指出的那样, elapsedTime.microseconds的上限为 10^6。 So, for example, for a 10 second sleep() , elapsedTime.microseconds gives 8325 (which is wrong , should be around 10,000,000 ).因此,例如,对于 10 秒的sleep()elapsedTime.microseconds给出8325 (这是错误的,应该在10,000,000左右)。

这是为了找出当前时间和上午 9.30 之间的差异

t=datetime.now()-datetime.now().replace(hour=9,minute=30)

To get the hour , minute and second , you can do this要获得hourminutesecond ,您可以这样做

>>> import datetime
>>> first_time = datetime.datetime.now()
>>> later_time = datetime.datetime.now()
>>> difference = later_time - first_time
>>> m,s = divmod(difference.total_seconds(), 60)
>>> print("H:M:S is {}:{}:{}".format(m//60,m%60,s)

This is my approach using mktime .这是我使用mktime 的方法。

from datetime import datetime, timedelta
from time import mktime

yesterday = datetime.now() - timedelta(days=1)
today = datetime.now()

difference_in_seconds = abs(mktime(yesterday.timetuple()) - mktime(today.timetuple()))
difference_in_minutes = difference_in_seconds / 60

In Other ways to get difference between date;以其他方式获得日期之间的差异;

import dateutil.parser
import datetime
last_sent_date = "" # date string
timeDifference = current_date - dateutil.parser.parse(last_sent_date)
time_difference_in_minutes = (int(timeDifference.days) * 24 * 60) + int((timeDifference.seconds) / 60)

So get output in Min.所以在 Min 中获得输出。

Thanks谢谢

I have used time differences for continuous integration tests to check and improve my functions.我已经使用持续集成测试的时间差异来检查和改进我的功能。 Here is simple code if somebody need it如果有人需要,这里是简单的代码

from datetime import datetime

class TimeLogger:
    time_cursor = None

    def pin_time(self):
        global time_cursor
        time_cursor = datetime.now()

    def log(self, text=None) -> float:
        global time_cursor

        if not time_cursor:
            time_cursor = datetime.now()

        now = datetime.now()
        t_delta = now - time_cursor

        seconds = t_delta.total_seconds()

        result = str(now) + ' tl -----------> %.5f' % seconds
        if text:
            result += "   " + text
        print(result)

        self.pin_time()

        return seconds


time_logger = TimeLogger()

Using:使用:

from .tests_time_logger import time_logger
class Tests(TestCase):
    def test_workflow(self):
    time_logger.pin_time()

    ... my functions here ...

    time_logger.log()

    ... other function(s) ...

    time_logger.log(text='Tests finished')

and i have something like that in log output我在日志输出中有类似的东西

2019-12-20 17:19:23.635297 tl -----------> 0.00007
2019-12-20 17:19:28.147656 tl -----------> 4.51234   Tests finished

Based on @Attaque great answer , I propose a shorter simplified version of the datetime difference calculator:基于@Attaque 很好的答案,我提出了一个更短的日期时间差计算器的简化版本:

seconds_mapping = {
    'y': 31536000,
    'm': 2628002.88, # this is approximate, 365 / 12; use with caution
    'w': 604800,
    'd': 86400,
    'h': 3600,
    'min': 60,
    's': 1,
    'mil': 0.001,
}

def get_duration(d1, d2, interval, with_reminder=False):
    if with_reminder:
        return divmod((d2 - d1).total_seconds(), seconds_mapping[interval])
    else:
        return (d2 - d1).total_seconds() / seconds_mapping[interval]

I've changed it to avoid declaring repetetive functions, removed the pretty print default interval and added support for milliseconds, weeks and ISO months (bare in mind months are just approximate, based on assumption that each month is equal to 365/12 ).我对其进行了更改以避免声明重复函数,删除了漂亮的打印默认间隔并增加了对毫秒、周和 ISO 月份的支持(请记住,月份只是近似值,基于每个月等于365/12 )。

Which produces:其中产生:

d1 = datetime(2011, 3, 1, 1, 1, 1, 1000)
d2 = datetime(2011, 4, 1, 1, 1, 1, 2500)

print(get_duration(d1, d2, 'y', True))      # => (0.0, 2678400.0015)
print(get_duration(d1, d2, 'm', True))      # => (1.0, 50397.12149999989)
print(get_duration(d1, d2, 'w', True))      # => (4.0, 259200.00149999978)
print(get_duration(d1, d2, 'd', True))      # => (31.0, 0.0014999997802078724)
print(get_duration(d1, d2, 'h', True))      # => (744.0, 0.0014999997802078724)
print(get_duration(d1, d2, 'min', True))    # => (44640.0, 0.0014999997802078724)
print(get_duration(d1, d2, 's', True))      # => (2678400.0, 0.0014999997802078724)
print(get_duration(d1, d2, 'mil', True))    # => (2678400001.0, 0.0004999997244524721)

print(get_duration(d1, d2, 'y', False))     # => 0.08493150689687975
print(get_duration(d1, d2, 'm', False))     # => 1.019176965856293
print(get_duration(d1, d2, 'w', False))     # => 4.428571431051587
print(get_duration(d1, d2, 'd', False))     # => 31.00000001736111
print(get_duration(d1, d2, 'h', False))     # => 744.0000004166666
print(get_duration(d1, d2, 'min', False))   # => 44640.000024999994
print(get_duration(d1, d2, 's', False))     # => 2678400.0015
print(get_duration(d1, d2, 'mil', False))   # => 2678400001.4999995

You may find this fast snippet useful in not so much long time intervals:您可能会发现这个快速片段在不太长的时间间隔内很有用:

    from datetime import datetime as dttm
    time_ago = dttm(2017, 3, 1, 1, 1, 1, 1348)
    delta = dttm.now() - time_ago
    days = delta.days # can be converted into years which complicates a bit…
    hours, minutes, seconds = map(int, delta.__format__('').split('.')[0].split(' ')[-1].split(':'))

tested on Python v.3.8.6在 Python v.3.8.6 上测试

Here is an answer that is easy to generalise or turn into a function and which is reasonable compact and easy to follow.这是一个易于概括或转化为函数且合理紧凑且易于遵循的答案。

ts_start=datetime(2020, 12, 1, 3, 9, 45)
ts_end=datetime.now()
ts_diff=ts_end-ts_start
secs=ts_diff.total_seconds()
days,secs=divmod(secs,secs_per_day:=60*60*24)
hrs,secs=divmod(secs,secs_per_hr:=60*60)
mins,secs=divmod(secs,secs_per_min:=60)
secs=round(secs, 2)
answer='Duration={} days, {} hrs, {} mins and {} secs'.format(int(days),int(hrs),int(mins),secs)
print(answer)

It gives an answer in the form Duration=270 days, 10 hrs, 32 mins and 42.13 secs它以Duration=270 days, 10 hrs, 32 mins and 42.13 secs形式给出答案

import datetime
date = datetime.date(1, 1, 1)
#combine a dummy date to the time
datetime1 = datetime.datetime.combine(date, start_time)
datetime2 = datetime.datetime.combine(date, stop_time)  
#compute the difference
time_elapsed = datetime1 - datetime2

start_time --> start time for datetime object start_time --> 日期时间对象的开始时间
end_time--> end time for datetime object end_time--> datetime 对象的结束时间

we cannot directly subtract the datetime.time objects我们不能直接减去 datetime.time 对象
hence we need to add a random date to it (we use combine)因此我们需要为其添加一个随机日期(我们使用组合)
or you can use the "today" instead of (1,1,1)或者您可以使用“今天”而不是 (1,1,1)

hope this helps希望这可以帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 Python 中找到两个日期时间对象之间的毫秒差异? - How do I find the difference in milliseconds between two datetime objects in Python? 你如何在Python中获得两个时间对象之间的差异 - How do you get the difference between two time objects in Python 如何找到两个时区之间的小时差? - How do I find the difference in hours between two time zones? 如何使用Google日历api python找到两个事件之间的时差 - How do I find the time difference between two events using the Google calender api python Python中日期时间对象之间的营业时间差 - Business time difference between datetime objects in Python 如何获得两个 datetime.time Pandas 列之间的绝对差异? - How do I get the absolute difference between two datetime.time Pandas columns? 如何检查2个datetime对象的时间差? - How do I check the difference in time of 2 datetime objects? 获取两个日期时间对象之间的时差,以小时,分钟和秒为单位 - Get time difference between two datetime objects as hour, min and sec 如何计算 python 中 2 个日期时间之间的差异 - How do I calculate difference between 2 datetime in python 在Python中找到两个时间字符串之间的差异 - Find difference between two time strings in Python
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM