Python日期函数错误

时间:2015-07-31 08:36:36

标签: python

我正在尝试在python中创建一个显示日期的函数。所以我可以看到程序运行,我已经设置了一天到五秒,所以每五秒就会成为下一天的一天。它会打印日期。

我知道已经有一个用于显示日期的内置函数,但是我对python很新,我正在努力提高我的技能(所以请原谅我糟糕的编码。)

我已将开始日期设定为2000年1月1日。

这是我的代码:

import time

def showDate():
    year = 00
    month = 1
    day = 1
    oneDay = 5
    longMonths = [1, 3, 5, 7, 8, 10, 12]
    shortMonths = [4, 6, 9, 11]
    while True:
        time.sleep(1)
        oneDay = oneDay - 1
        if oneDay == 0:
            if month in longMonths:
                if day > 31:
                    day = day + 1
                else:
                    month = month + 1
                    day = 0
            if month == 2:
                if day > 28:
                    day = day + 1
                else:
                    month = month + 1
                    day = 0
            if month in shortMonths:
                if day > 30:
                    day = day + 1
                else:
                    month = month + 1
                    day = 0
            if day == 31 and month == 12:
                year = year + 1
            print(str(day) + '/' + str(month) + '/' + str(year))
            oneDay = 5

showDate()

但是,当我尝试运行程序时,这是我得到的输出:

>>> 
0/3/0
0/5/0
0/7/0
0/8/0
0/10/0
0/12/0
0/13/0
0/13/0
0/13/0

我不知道为什么会这样,有人可以建议一个解决方案吗?

3 个答案:

答案 0 :(得分:3)

day增加的代码中没有可能的路径。

我认为你在><之间实际上感到困惑:你检查一天更大是否超过31或28,这是不可能的。我认为你的意思是if day < 31:等等。

答案 1 :(得分:1)

首先,只需设置time.sleep(5)而不是循环time.sleep(1) 5次就更容易了。最好有一个月份日期的值列表,而不仅仅是长短月份的2个列表。你的while循环目前也是无限期的,是故意的吗?

无论如何,你的主要问题是比较day > 31,但有很多事情可以改进。正如我所说的那样,我正在删除使用oneDay来执行sleep(5),因为它更干净并且有一个daysInMonths列表。

import time

    def showDate():
        year = 00
        month = 1
        day = 1
        daysInMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

现在,只有一个if可以检查当天是否已达到月末,如下所示:

        while True:
            time.sleep(5)
            if day < daysInMonths[month-1]:
                day += 1

这将检查当前月份的列表索引。它使用-1因为列表从索引0开始,而你的月份从1开始。(即从1-12开始的月份,但列表的索引是0-11)。我还使用了+=运算符,它基本上是var = var + something的简写。它的工作方式相同,看起来更整洁。

此测试包含所有月份,然后替代方案是您需要增加月份。我建议您在此块中首先检查月份是否为12,然后从那里增加年份。此外,您应该将daymonth设置为1,因为那是他们的起始值。如果不是年末,请将月份增加并将日期设置为1。

            else:
                if month == 12:
                    year += 1
                    day = 1
                    month = 1
                else:
                    month += 1
                    day = 1
            print("{}/{}/{}".format(day, month, year))

我还使用string.format语法来保持整洁。使用format,它将替换您在字符串中传递给{}的变量。它使得更容易布置字符串实际上应该看起来如何,并且它隐式地将变量转换为字符串格式。

答案 2 :(得分:0)

试试这个。

日期比较应为<,而不是>。到下个月时,我将日期设置为1,因为日历中没有天0。我使用elif进行后续月测试,因为所有情况都是独占的。

def showDate():
    year = 00
    month = 1
    day = 1
    oneDay = 5
    longMonths = [1, 3, 5, 7, 8, 10, 12]
    shortMonths = [4, 6, 9, 11]
    while True:
        time.sleep(1)
        oneDay = oneDay - 1
        if oneDay == 0:
            if month in longMonths:
                if day < 31:
                    day = day + 1
                else:
                    month = month + 1
                    day = 1
            elif month == 2:
                if day < 28:
                    day = day + 1
                else:
                    month = month + 1
                    day = 1
            if month in shortMonths:
                if day < 30:
                    day = day + 1
                else:
                    month = month + 1
                    day = 1
            if day == 31 and month == 12:
                year = year + 1
                month = 1
            print(str(day) + '/' + str(month) + '/' + str(year))
            oneDay = 5