【问题标题】:How to not start the next day with datetime while adding a timedelta?添加时间增量时如何不使用日期时间开始第二天?
【发布时间】:2015-05-26 16:29:30
【问题描述】:

给定当前时间23:30:00,我加上两个小时(7200 秒)。我怎样才能得到同一天的时间?所以我想要25:30:00

目前我只能得到第二天的时间:

>>> from datetime import datetime, timedelta
>>> current_time  = "23:30:00"
>>> duration = 3600
>>> (datetime.strptime(current_time, "%H:%M:%S") + timedelta(seconds=duration)).strftime("%H:%M:%S")
'00:30:00'

【问题讨论】:

  • timedelta 添加到datetime 是时间感知的,因此如果适当,添加两个小时将自动更新日期。要获得您想要的行为,您需要不使用 datetime 对象。
  • 你能举个例子来说明如何做到这一点吗?
  • 25:30:00 不是有效时间。
  • 我同意你们的看法。我想生成一个有效的 GTFS 数据集。 Google 定义进入第二天的行程需要这样的时间:developers.google.com/transit/gtfs/reference#stop_times_fields
  • duration = 36000 应该输出什么?

标签: python datetime timedelta


【解决方案1】:

如果你只是想增加小时、分钟、秒并创建一个字符串:

def weird_time(current_time,duration):
    start = datetime.strptime(current_time, "%H:%M:%S")
    st_hr, st_min, st_sec = start.hour, start.minute, start.second
    mn, secs = divmod(duration, 60)
    hour, mn = divmod(mn, 60)
    mn, secs = st_min+mn, st_sec+secs
    if secs > 59:
        m, secs = divmod(secs,60)
        mn += m
    if mn > 59:
        h, mn = divmod(mn,60)
        hour += h
    return "{:02}:{:02}:{:02}".format(st_hr+hour, mn, secs)

输出:

In [19]: weird_time("23:30:00",7200)
Out[19]: '25:30:00'

In [20]: weird_time("23:30:00",3600)
Out[20]: '24:30:00'

In [21]: weird_time("23:30:59",7203)
Out[21]: '25:31:02'

In [22]: weird_time("23:30:59",3601)
Out[22]: '24:31:00'

我们也可以使用 timedelta 来计算总秒数,并以此进行计算,而不是自己进行所有计算:

from datetime import datetime,timedelta


def weird_time(current_time,duration):
    start = datetime.strptime(current_time, "%H:%M:%S")
    st_hr, st_min, st_sec = start.hour, start.minute, start.second
    comb = timedelta(minutes=st_min,seconds=st_sec) + timedelta(seconds=duration)
    mn, sec = divmod(comb.total_seconds(), 60)
    hour, mn = divmod(mn, 60)
    return "{:02}:{:02}:{:02}".format(int(st_hr+hour), int(mn), int(sec))

输出相同:

In [29]: weird_time("23:30:00",7200)
Out[29]: '25:30:00'

In [30]: weird_time("23:30:00",3600)
Out[30]: '24:30:00'

In [31]: weird_time("23:30:59",7203)
Out[31]: '25:31:02'

In [32]: weird_time("23:30:59",3601)
Out[32]: '24:31:00'

In [33]:  weird_time("05:00:00",3600)
Out[33]: '06:00:00'

小时只需要增加,我们需要捕获的部分是秒、分钟或两者的总和大于 59。

【讨论】:

  • 我试过你的代码,它返回了33:30:00。当期望的输出是25:30:00.
  • @sobolevn,那是因为我原来设置duration为36000,现在试试
  • 有一个错误,我想已经解决了!
  • 您不需要从头开始实现时间算术。 Use timedelta and format it at the end.
  • @J.F.Sebastian,我正在使用 timedelta
【解决方案2】:

在我看来,您想要的只是添加两个 timedeltas 以获得另一个 timedelta... 对吗?

from datetime import timedelta as td

t0 = td(hours=23, minutes=30)
t1 = t0 + td(seconds=7200)
print(t1)  # prints "1 day, 1:30:00"
print("Hours: {}".format(t1.days*24 + int(t1.seconds/3600)))  # prints "Hours: 25"

【讨论】:

【解决方案3】:

我想生成一个有效的 GTFS 数据集。谷歌定义到第二天的行程需要这样的时间:http://developers.google.com/transit/gtfs/reference#stop_times_fields

要获得正确的时间,您必须考虑夏令时的变化:

#!/usr/bin/env python
from datetime import datetime, time, timedelta
from tzlocal import get_localzone # $ pip install tzlocal

local_timezone = get_localzone()
current_time = datetime.now(local_timezone)
noon_naive = datetime.combine(current_time, time(12,0))
noon = local_timezone.localize(noon_naive, is_dst=None)

departure_time = (current_time - noon + timedelta(hours=12))
duration = timedelta(hours=2)
arrival_time = departure_time + duration
# -> datetime.timedelta(1, 5400)

timedelta 转换为HH:MM:SS 格式:

hours, seconds = divmod(arrival_time.total_seconds(), 3600)
minutes, seconds = divmod(seconds, 60)
print("%(hours)02d:%(minutes)02d:%(seconds)02d" % vars())
# -> 25:30:00

【讨论】:

  • 不能从日期时间导入时区。
  • @ustroetz: 1. 你可以在 Python 3 中使用 2. 它没有在代码中使用。我已将其删除。
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 2023-01-26
  • 2011-03-15
  • 2022-11-03
  • 1970-01-01
  • 2021-07-24
  • 2016-08-21
  • 2014-06-29
相关资源
最近更新 更多