class datetime.timedelta如何工作?

时间:2014-08-05 22:31:46

标签: python date

我一直在编写一个python脚本来删除文件夹中的文件,如果它们超过x个月。

我可以轻松删除超过一年的文件。 我也可以取两个值,x(一个文件)和y(一个月数),如果它早于y个月,则删除x,假设它们在同一个日历年。

我遇到的问题是年份从一个过去到另一个,但文件x仍然比y个月还年轻。 (例如,如果当前日期是2014年1月并且文件是在2013年12月创建的,则不应删除它,但如果当前日期是2014年1月并且文件在2013年3月被修改,则应删除该文件)。

我试图想出一个基于月号(jan = 01等)来解决这个问题的算法,但我无法理解。我发现我可以使用datetime.timedelta实例来表示两个日期类datetime.timedelta之间的差异。我想从头开始编写代码,或者至少看看它是如何工作的。我找不到python docs中class datetime.timedelta的代码。我想学习如何解决这个问题,而不依赖于我不理解的内置类。任何人都可以帮我理解这个吗?

import os
import time
import math

def main():

    path = '/home/gabriel/Documents/bookmarks/'
    months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

    for root, dirs, files in os.walk(path):
        print "root:", root
        print "dirs:", dirs
        print "files:"

        for f in files:
            mtime = "%s" % time.ctime(os.path.getmtime('%s%s' % (path,f)))
            print "\tlast modified: %s %s" % (mtime, f)
            weekDay, month, day, HMS, year = mtime.split()
            if int(time.strftime("%Y")) - int(year) > 1:
                print "\t... deleting %s" % f
                os.remove('%s%s' % (path,f))
            # elif int(time.strftime("%Y")) - int(year) == 1 & :
            # after the & in the elif expression above is what I cannot figure out. 

            elif abs((months.index(month) + 1)-(int(time.strftime("%m")))) > 4:
                print "\t... deleting %s" % f
                os.remove('%s%s' % (path,f))



main()

3 个答案:

答案 0 :(得分:1)

timedelta代表一段时间(或两个日期时间之间的差异),以天,秒和微秒表示。

创建timedelta时,您可以使用其他单位,例如周,小时等,并且在将所有内容标准化以使用简化/任意单位集时,需要进行相当多的数学计算。除此之外,它基本上只是一个尺寸值。

一旦您意识到timedelta不存储月份或年份,仅存储数天,则日期时间的数学计算(用于减去两个日期或添加timedeltas和日期)也相当简单。日期算术对序数值(date.toordinal()date.fromordinal())起作用,它们是当前公历中人工向后延伸的从0001-01-01开始的天数的整数表示。然后对秒/微秒和时区差异进行一些调整。

简而言之,几个月本身并没有真正涉及这种日期数学。

现在,让我们谈谈减去几个月。假设一个月是31天对于删除备份这样的事情可能很好。 datetime.now() - timedelta(days=31),繁荣,完成,除非出现时区问题。

从长远来看,假设31天的月份可以达到372天。

所以,假设您要减去“实际”月份。您需要查看每个月减去的长度并依次减去它们。但是你减去当前月份的长度来回去一个月或上个月吗?从长远来看,它基本上是平衡的。

答案 1 :(得分:0)

最简单的方法是不使用timedelta。只需将您的时间戳与现在进行比较:

tseconds = time.time() - os.path.getmtime(...)

这是自上次修改以来经过的时间(以秒为单位)。由于您谈论的是几个月的时间表,我不认为您真的关心文件是否在2013年2月1日或1月31日被修改:它们属于不同月份,但无论如何都应该删除。

如果您真的想使用timedelta,请使用该秒数构建它:

tdelta = datetime.timedelta(seconds=tseconds)

但它不会自动给你几个月。同样,你正在大规模工作,你可以假设所有月份都有31天并且是安全的。

答案 2 :(得分:0)

如果您真的想知道timedelta的实施方式,请在Python库源代码中查找class timedeltahttp://hg.python.org/cpython/file/tip/Lib/datetime.py

如果这是您想知道的,我会要求您编辑您的问题并删除所有不相关的内容(例如源代码和有关删除旧文件的文本)。