编写函数用time_t显示当前日期?
我正在写一个时间转换器,目的是把系统的时间格式(time_t)转换成我们能看懂的日期和时间。哦,对了,这是我写的第二个Python脚本。我们就不提这个了,继续往下说。
完整的脚本可以在这里找到。
写年份和月份的转换器比较简单,但我在处理日期时遇到了大麻烦。正如你所看到的,我一直在尝试从1970年一直算到今天。不幸的是,计算出来的日期是-105。
有没有人知道更好的方法,或者能帮我修正一下我现在的尝试?现在是凌晨3:30,所以可能我漏掉了一些明显的东西。
抱歉,我忘了说我这样做是为了手动学习Python。如果用日期函数来做,那就失去了学习的意义了。
4 个回答
3
你可以用 time.strftime
这个方法来实现:
>>> import time
>>> time.strftime('%Y %B %d')
'2009 September 18'
或者你也可以用 datetime.date.strftime
这个方法:
>>> import datetime
>>> datetime.date.today().strftime('%Y %B %d')
'2009 September 18'
8
为什么不使用:
from datetime import datetime
the_date = datetime.fromtimestamp(the_time)
print(the_date.strftime('%Y %B %d'))
datetime模块可以处理所有特殊情况,比如闰年、闰秒和闰天,还能进行时区转换(可以选择加一个参数)
1
(我假设你这样做是为了学习Python,所以我会指出你代码中的错误)。
>>> years = SecondsSinceEpoch / 31540000
不不不不。你不能这样做。有些年份有31536000秒,而有些年份有31622400秒。
>>> if calendar.isleap(yeariterator) == True:
你不需要测试一个真实的值是否为真。:-) 你可以这样做:
>>> if calendar.isleap(yeariterator):
而是。
还要改成:
>>> yeariterator = 1969
>>> iterator = 0
>>> while yeariterator < yearsfordayfunction:
>>> yeariterator = yeariterator + 1
变成:
for yeariterator in range(1970, yearsfordayfunction):
这样也能修复你的错误:你不会在2009年之前停止,所以你得到的答案是-105,因为这一年还剩下105天。
而且,按月计算其实没什么必要,按年计算就可以了。
for yeariterator in range(1970, yearsfordayfunction):
if calendar.isleap(yeariterator) == True:
days = days - 366
else:
days = days - 365
另外,缩进8个空格太多了,4个空格更常见。
我还建议你把年份和一年中的天数放在一个方法里计算,而不是做两次。
def YearDay():
SecondsSinceEpoch = int(time.time())
days = SecondsSinceEpoch // 86400 # Double slash means floored int.
year = 1970
while True:
if calendar.isleap(year):
days -= 366
else:
days -= 365
year += 1
if calendar.isleap(year):
if days <= 366:
return year, days
else:
if days <= 365:
return year, days
def MonthDay(year, day):
if calendar.isleap(year):
monthstarts = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]
else:
monthstarts = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]
month = 0
for start in monthstarts:
if start > day:
return month, day - monthstarts[month-1] + 1
month += 1