Python strftime时钟

时间:2015-02-27 22:21:08

标签: python datetime strftime

我正在尝试编写一个倒计时时钟脚本。我想在将来使用一个设定日期,并以可读的格式倒计时。小时,分钟,秒我打算打印到16x2的lCD显示器。我遇到的问题是尝试将日期之间差异的输出转换为漂亮的格式。到目前为止,我已经附上了我的内容。我收到错误:

AttributeError: 'datetime.timedelta' object has no attribute 'strftime' 

这是我的代码:

from datetime import datetime
from time import strftime

deploy = datetime(2015, 3, 21, 0, 0)
mydate = datetime.now() - deploy
print (mydate.strftime("%b %d %H:%M:%S"))

我知道如何打印到我的LCD并创建一个循环,只需要帮助这部分。

1 个答案:

答案 0 :(得分:3)

有两个问题:

  • 如果您使用本地时间表示为天真的日期时间对象,如果相应的本地时间具有不同的utc偏移,例如,在DST转换附近,则时差可能不正确
  • 差异是timedelta没有strftime()方法的对象

要修复它,convert deploy from local timezone to UTC

#!/usr/bin/env python
import time
from datetime import datetime, timedelta

deploy = datetime(2015, 3, 21, 0, 0) # assume local time
timestamp = time.mktime(deploy.timetuple()) # may fail, see the link below
deploy_utc = datetime.utcfromtimestamp(timestamp)
elapsed = deploy_utc - datetime.utcnow() # `deploy` is in the future

其中elapsed是不计算闰秒的经过时间(例如2015-07-01 00:59:60 BST+0100)。

有关time.mktime()可能失败的详细信息,请参阅Find if 24 hrs have passed between datetimes - Python

要将timedelta转换为字符串,您可以使用str()函数:

print(elapsed) # print full timedelta
# remove microseconds
trunc_micros = timedelta(days=elapsed.days, seconds=elapsed.seconds) 
print(trunc_micros) # -> 20 days, 13:44:14 <- 17 chars
# remove comma
print(str(trunc_micros).replace(',', '')) 
# -> 20 days 13:44:14 <- 16 chars

如果您需要其他格式,请使用divmod()功能转换为小时,分钟,秒:

seconds = elapsed.days*86400 + elapsed.seconds # drop microseconds
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
print("{hours:02d}:{minutes:02d}:{seconds:02d}".format(**vars()))
# -> 493:44:14