Python中日期之间的差异,打印为00:00:00

时间:2017-11-10 13:24:24

标签: python-3.x

所以我有一个字符串表示我转换为datetime的日期,我想打印这个日期(在utc中)和utc中当前时间之间的时差。即。如果是提前1天和5小时,请打印“01:05:00”。或者,如果提前6分钟,请打印“00:00:06”。如果日期是过去的日期,则前缀“ - ”,如“-00:00:06”。

到目前为止,我有一个非常糟糕的解决方案,如果它在27分钟之外打印出类似“0:0:27”的东西,如果是过去的2天则打印“-2:-5:-46”。我希望每次都有一致的xx:xx:xx格式。我看了很多问题,甚至不确定我是否需要使用relativedelta或者只是使用datetime.timedelta。有什么建议吗?

for ticket in json.loads(data):
    ticket_rdate = ticket["time_string"]
    if ticket_rdate:
        ticket_rdate = datetime.datetime.strptime(ticket_rdate, "%Y-%m-%d %H:%M:%S")
        difference = relativedelta(datetime.datetime.utcnow(), ticket_rdate)
        ticket["time_until"] = str(difference.days * -1) + ":" + str(difference.hours * -1) + ":" + str(difference.minutes * -1) + ""
    sorted_tickets.append(ticket)
return sorted_tickets

这是在python 3中。

3 个答案:

答案 0 :(得分:0)

如果你这样做

difference = (datetime.datetime.utcnow() -  ticket_rdate)
str(difference)

您将以一致的格式获得输出。您可以在此之后进行一些字符串格式化,以获得您提到的格式。

答案 1 :(得分:0)

使用字符串的格式方法,可以指定零填充。像:

now = datetime.datetime.utcnow()
diff = utcnow - ticket_rdate

negative = '-' if ticket_rdate < utcnow else ''
hours = int(diff.total_seconds() / 3600)
mins = int(diff.total_seconds() / 60)
ticket['time_until'] = '{}{}:{:02}:{:02}'.format(negative, diff.days, hours, mins)

此外,如果您想要更灵活,使用relativedelta而不是timedelta的原因。 relativedelta将让你与其他单位合作,如数月和数年,并为负增量提供更好的支持。

https://docs.python.org/2/library/datetime.html#timedelta-objects

http://labix.org/python-dateutil#head-ba5ffd4df8111d1b83fc194b97ebecf837add454

答案 2 :(得分:0)

考虑到你将精确度限制在几天,我说你并不需要使用relativedelta。如果你想要数周或数月,肯定,但你不是。

因此,在Py3中记住这一点,你可以做类似的事情:

delta = time1 - time2
delta = delta // timedelta(minutes=1)
print(str(delta))

让所提供的功能完成繁重的工作。