在python中计算日期

时间:2012-03-12 09:41:09

标签: python

def main(filename, from_str, to_str):
    date_from =time.strptime(from_str, "%Y-%m-%d %H:%M")
    date_to = time.strptime(to_str, "%Y-%m-%d %H:%M")
    print date_from, date_to
    days = (date_from - date_to).days
    print days

if __name__ == "__main__":
    if len(sys.argv) < 1:
        print "Usage: %s DATE [e.g. 2011-09-08 2011-10-08]"
        sys.exit(1)
    main("servanet-" + sys.argv[1] + sys.argv[2]+ ".txt", sys.argv[1] + " 00:00", sys.argv[2] + " 23:59")

这是我的代码的一部分,我想从输入中计算天数(我不需要计算分钟和秒数,在这种情况下只需几天,但我将在稍后使用分钟和第二个信息)代码,所以我需要像这样保留它们),但似乎,(date_from - date_to).days无法在它之后的几分钟和几秒内工作,我该如何解决这个问题呢?

非常感谢!

========评论:我想我不能简单地使用day2-day1。因为如果它们来自不同月份,结果将是错误的,例如从2011-08-01到2011-09-02

3 个答案:

答案 0 :(得分:3)

使用datetime.datetime.strptime代替time.strptimetime.striptime返回不支持减法的time.struct_time对象。相反,datetime.datetime.strptime返回一个datetime.datetime对象,它支持日期算术。

import datetime as dt

def main(filename, from_str, to_str):
    date_from = dt.datetime.strptime(from_str, "%Y-%m-%d %H:%M")
    date_to = dt.datetime.strptime(to_str, "%Y-%m-%d %H:%M")
    print date_from, date_to
    days = (date_from - date_to).days
    print days

产量

% test.py '2011-09-08' '2011-10-08'
2011-09-08 00:00:00 2011-10-08 23:59:00
-31

顺便说一句,sys.argv始终至少为长度1.第一项是调用程序的名称。所以我认为你需要

if __name__ == "__main__":
    if len(sys.argv) <= 2:
        print "Usage: %s DATE [e.g. 2011-09-08 2011-10-08]"

而不是if len(sys.argv) < 1

答案 1 :(得分:0)

import datetime
import time

def parse_date(date_str):
  if ' ' in date_str:
    return time.strptime(date_str, "%Y-%m-%d %H:%M")
  else:
    return time.strptime(date_str, "%Y-%m-%d")

def main(filename, from_str, to_str):
  date_from = parse_date(from_str)
  date_to = parse_date(to_str)
  print date_from, date_to
  days = (datetime.date(*date_to[:3]) - datetime.date(*date_from[:3])).days
  print days

答案 2 :(得分:0)

我不确定你的意思是“不能用分钟和秒”。但我修改了你的功能,它应该没问题:

def main(filename, from_str, to_str):
    date_from = datetime.strptime(from_str, "%Y-%m-%d %H:%M")
    date_to = datetime.strptime(to_str, "%Y-%m-%d %H:%M")
    print date_from, date_to
    days = (date_to - date_from).days
    print days

main("", "2011-09-08 00:00", "2011-10-09 00:00")
main("", "2011-09-08 00:00", "2011-10-08 23:59")
main("", "2011-09-08 00:00", "2011-10-08 00:00")

>>> 2011-09-08 00:00:00 2011-10-09 00:00:00
31
2011-09-08 00:00:00 2011-10-08 23:59:00
30
2011-09-08 00:00:00 2011-10-08 00:00:00
30