1

我一直在编写一个时间转换器来获取系统 time_t 并将其转换为人类可读的日期/时间。哦,这是我的第二个 python 脚本。我们将把这个事实放在一边,继续前进。

完整的脚本托管在这里

为年和月编写转换器相当容易,但我在努力让一天工作时遇到了严重的问题。正如你所看到的,从 1970 年到今天,我一直在尝试暴力破解。不幸的是,这一天是-105。

有谁知道更好的方法,或者修复我在这里尝试的方法?现在是凌晨 3:30,所以我很可能遗漏了一些明显的东西。

抱歉,我忘了说明我是手动执行此操作以学习 python 的。不幸的是,通过日期函数这样做会违背目的。

4

4 回答 4

8

为什么不使用:

from datetime import datetime
the_date = datetime.fromtimestamp(the_time)
print(the_date.strftime('%Y %B %d'))

datetime 模块处理所有边缘情况——闰年、闰秒、闰日——以及时区转换(带有可选的第二个参数)

于 2009-09-18T15:26:30.790 回答
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'
于 2009-09-18T15:25:42.273 回答
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

到:

对于范围内的年迭代器(1970 年,yearsforday 函数):

这也将解决您的错误:您直到 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
于 2009-09-18T15:51:27.217 回答
0

我还会在您发布的代码中指出一些奇怪的地方:

    try:
            SecondsSinceEpoch = time.time()
    except IOError:
            Print("Unable to get your system time!")

1.) 为什么会time.time()引发 IOError?据我所知,该函数不可能引发错误,它应该始终返回一个值。

2.)Print应该是print

3.)即使time.time确实引发了IOError异常,您也正在吞下异常,您可能不想这样做。需要定义下一行SecondsSinceEpoch,这样只会引发另一个(更令人困惑的)异常。

于 2009-09-19T02:40:53.110 回答