我正在寻找一个命令行工具或某种python库(我可以将其包装),以便我可以计算指定日期,如“每月的最后一个星期四”。
即。我想让人们像上面那样输入人类友好的文本,它应该能够计算任何月份/年度的任何日期/任何满足该条件的日期。
有什么建议吗?
答案 0 :(得分:7)
mxDateTime和Datejs以及该webservice都不支持“本月的最后一个星期四”。 OP想知道这个月的所有最后一个星期四,例如,整整一年。
mxDateTime支持这些操作,但问题必须在Python代码中提出,而不是字符串。
我能想到的最好的是parsedatetime,但这并不支持“本月的最后一个星期四”。它确实支持:
>>> c.parseDateText("last thursday of april 2001")
(2001, 4, 20, 13, 55, 58, 3, 64, 0)
>>> c.parseDateText("last thursday of may 2001")
(2001, 5, 20, 13, 56, 3, 3, 64, 0)
>>> c.parseDateText("last thursday of may 2010")
(2010, 5, 20, 13, 56, 7, 3, 64, 0)
>>>
(请注意,DateJS和该Web服务都不支持此语法。)
编辑:嗯,好吧,但是虽然年份和月份都是正确的,但这一天却没有。 2001年4月的最后一个星期四是27日。我想你将不得不在这里推出自己的解决方案。
它不支持:
>>> c.parseDateText("last thursday of 2010")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "parsedatetime/parsedatetime.py", line 411, in parseDateText
mth = self.ptc.MonthOffsets[mth]
KeyError
>>>
所以一种可能性是文本替换:将字符串规范化为小写,单个空格等,然后对你感兴趣的每个月做一个字符串替换“月份”。你可能不得不调整任何一个找到的解决方案。例如,在他为在线音乐压延系统编写的一些old code of Skip Montanaro中:
# someone keeps submitting dates with september spelled wrong...
'septmber':9,
或者您在mxDateTime之上编写自己的解析器,使用上述所有链接作为参考。
答案 1 :(得分:3)
我认为你可以使用Python的标准calendar模块,甚至可以在这些方法之上添加一些“人性化”方法。该模块为您提供了日期的迭代器,同时考虑了几周,等等。
首先我猜你必须回答“什么是一些人性化的方式来讨论约会?”,我猜这个问题超过了这个问题的一半。
答案 2 :(得分:3)
算法并不难。它们在下面的书中提供,值得每一分钱。
http://emr.cs.iit.edu/home/reingold/calendar-book/third-edition/
一般方法是找到所需月份的第一天。然后,您可以减去一天以查找所需月份的最后一天。然后计算相对于您找到的星期几的所需日期的偏移量。
假设您有datetime.dat
e,d
。您可以通过计算下个月减去一天的开始来计算月末。
monIx= d.year*12 + (d.month-1) + 1
endOfMonth= datetime.date( monIx//12, monIx%12+1, 1 ) - datetime.timedelta( days=1 )
此时,您正在寻找一周中所需日期的偏移量。在这种情况下,所需的星期几是星期四,即3
。
dayOffset = ((3 - endOfMonth.weekday()) -7 ) % -7
lastDay = endOfMonth + datetime.timedelta( days=dayOffset )
获取星期偏移量的一般方法需要一点思考,但只有少数案例组合需要进行试验。
答案 3 :(得分:2)
我不完全确定,但您可以查看Python DateUtil模块。
答案 4 :(得分:1)
好吧,不知道这样的库是否存在,但GNU coreutils中的date
有类似的东西:
$ date -d "last monday"
Mon Mar 2 00:00:00 RST 2009
答案 5 :(得分:1)
使用 mxDateTime 。 http://www.egenix.com/products/python/mxBase/mxDateTime/
答案 6 :(得分:-1)
如果这是针对网络应用程序的,请查看Datejs,在表单中使用它可能更容易,然后将日期对象的值传递给Python。
如果你最终自己写一个,那么来源也可能会有所帮助。