计算python中每月的第1个或第15个月的时间

pmi*_*ilb 3 python datetime

我正在尝试在python中编写一些预算程序.这是我写的第一个学习python的程序.第一步是根据今天的日期计算到第1天或第15天(发薪日)的天数.有人可以帮我一点吗?

Jer*_*rub 6

有趣的问题,这是一个完整的解决方案.我将从我的函数定义开始,我把它放在一个名为的文件中payday.py:

def nexypayday(fromdate=None):
    """
    @param fromdate: An instance of datetime.date that is the day to go from. If
                     not specified, todays date is used.
    @return: The first payday on or after the date specified.
    """
Run Code Online (Sandbox Code Playgroud)

接下来我们需要一些测试.这是为了清楚地定义我们方法的行为.因为你是python的新手,我将全力以赴,给你一个使用单元测试的例子.

from unittest import TestCase, main
import payday
import datetime

class TestPayday(TestCase):
    def test_first_jan(self):
        self.assertEqual(payday.nextpayday(datetime.date(2010, 1, 1)),
                         datetime.date(2010, 1, 1))

    def test_second_jan(self):
        self.assertEqual(payday.nextpayday(datetime.date(2010, 1, 2)),
                         datetime.date(2010, 1, 15))

    def test_fifteenth_jan(self):
        self.assertEqual(payday.nextpayday(datetime.date(2010, 1, 15)),
                         datetime.date(2010, 1, 15))

    def test_thirty_one_jan(self):
        self.assertEqual(payday.nextpayday(datetime.date(2010, 1, 31)),
                         datetime.date(2010, 2, 1))

    def test_today(self):
        self.assertTrue(payday.nextpayday() >= datetime.date.today())

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

这是一个可运行的python模块.你可以继续命名test_payday.py并运行它python test_payday.py.这应该立即失败并出现各种错误消息,因为我们还没有编写正确的代码.

在讨论了datetime.date如何工作之后,我已经解决了:mydatetime.day是月中的某一天,mydatetime + datetime.timedelta(days=1)datetime在一年中创建新的一天.因此,我可以把它放在一起payday.py.

import datetime

def nextpayday(fromdate=None):
    """
    @param fromdate: An instance of datetime.date that is the day to go from. If
                     not specified, todays date is used.
    @return: The first payday on or after the date specified.
    """
    if fromdate is None:
        fromdate = datetime.date.today()

    # while the day of the month isn't 1 or 15, increase the day by 1
    while fromdate.day not in (1, 15):
        fromdate = fromdate + datetime.timedelta(days=1)

    return fromdate
Run Code Online (Sandbox Code Playgroud)

运行单元测试,它应该是全金.请注意,在我的测试中,我已经确定如果我检查发薪日的"下一个"发薪日是什么,它会返回它自己的一天.将其更改为返回"下一个"发薪日是留给读者的练习.