编写函数用time_t显示当前日期?

1 投票
4 回答
2784 浏览
提问于 2025-04-15 14:25

我正在写一个时间转换器,目的是把系统的时间格式(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

撰写回答