代码之家  ›  专栏  ›  技术社区  ›  Craig McQueen

如何从日期中减去一天?

  •  591
  • Craig McQueen  · 技术社区  · 17 年前

    我有一条蟒蛇 datetime.datetime 对象减法一天最好的方法是什么?

    6 回复  |  直到 8 年前
        1
  •  1624
  •   Boris Verkhovskiy Brian Clapper    5 年前

    你可以使用 timedelta 对象:

    from datetime import datetime, timedelta
        
    d = datetime.today() - timedelta(days=days_to_subtract)
    
        2
  •  92
  •   S.Lott    17 年前

    减 datetime.timedelta(days=1)

        3
  •  75
  •   jfs    9 年前

    from datetime import datetime, timedelta
    from tzlocal import get_localzone # pip install tzlocal
    
    DAY = timedelta(1)
    local_tz = get_localzone()   # get local timezone
    now = datetime.now(local_tz) # get timezone-aware datetime object
    day_ago = local_tz.normalize(now - DAY) # exactly 24 hours ago, time may differ
    naive = now.replace(tzinfo=None) - DAY # same time
    yesterday = local_tz.localize(naive, is_dst=None) # but elapsed hours may differ
    

    一般来说 day_ago 和 yesterday 如果本地时区的UTC偏移量在最后一天发生变化,则可能会有所不同。

    例如,在美国/洛杉矶时区,夏令时/夏令时在2014年11月2日星期日凌晨02:00:00结束,因此如果:

    import pytz # pip install pytz
    
    local_tz = pytz.timezone('America/Los_Angeles')
    now = local_tz.localize(datetime(2014, 11, 2, 10), is_dst=None)
    # 2014-11-02 10:00:00 PST-0800
    

    然后 前一天 昨天 不同之处:

    • 前一天 正好是24小时前(相对于 now 现在
    • 昨天 是昨天上午10点,但是25小时前(相对于 现在 ),而不是24小时。

    pendulum module 自动处理它:

    >>> import pendulum  # $ pip install pendulum
    
    >>> now = pendulum.create(2014, 11, 2, 10, tz='America/Los_Angeles')
    >>> day_ago = now.subtract(hours=24)  # exactly 24 hours ago
    >>> yesterday = now.subtract(days=1)  # yesterday at 10 am but it is 25 hours ago
    
    >>> (now - day_ago).in_hours()
    24
    >>> (now - yesterday).in_hours()
    25
    
    >>> now
    <Pendulum [2014-11-02T10:00:00-08:00]>
    >>> day_ago
    <Pendulum [2014-11-01T11:00:00-07:00]>
    >>> yesterday
    <Pendulum [2014-11-01T10:00:00-07:00]>
    
        4
  •  47
  •   Sahil kalra    12 年前

    另一种方法 以及一个有用的用例:

    from datetime import datetime, timedelta
    print datetime.now() + timedelta(days=-1)  # Here, I am adding a negative timedelta
    
    • 在这种情况下很有用
    from datetime import datetime, timedelta
    print datetime.now() + timedelta(days=5, hours=-5)
    

    它同样可以与其他参数一起使用,例如秒、周等

        5
  •  10
  •   PlagTag    11 年前

    还有一个很好的函数,当我想计算时,我喜欢使用它,例如,上个月的第一天/最后一天或其他相关的时间差等等。。。

    dateutil 函数(datetime库的强大扩展)

    import datetime as dt
    from dateutil.relativedelta import relativedelta
    #get first and last day of this and last month)
    today = dt.date.today()
    first_day_this_month = dt.date(day=1, month=today.month, year=today.year)
    last_day_last_month = first_day_this_month - relativedelta(days=1)
    print (first_day_this_month, last_day_last_month)
    
    >2015-03-01 2015-02-28
    
        6
  •  7
  •   gr4viton    9 年前

    和弦箭头模块存在

    import arrow
    utc = arrow.utcnow()
    utc_yesterday = utc.shift(days=-1)
    print(utc, '\n', utc_yesterday)
    

    输出:

    2017-04-06T11:17:34.431397+00:00 
     2017-04-05T11:17:34.431397+00:00
    
        7
  •  -1
  •   VISHAKHA AGARWAL    5 年前
    class myDate:
    
        def __init__(self):
            self.day = 0
            self.month = 0
            self.year = 0
            ## for checking valid days month and year
            while (True):
                d = int(input("Enter The day :- "))
                if (d > 31):
                    print("Plz 1 To 30 value Enter ........")
                else:
                    self.day = d
                    break
    
            while (True):
                m = int(input("Enter The Month :- "))
                if (m > 13):
                    print("Plz 1 To 12 value Enter ........")
                else:
                    self.month = m
                    break
    
            while (True):
                y = int(input("Enter The Year :- "))
                if (y > 9999 and y < 0000):
                    print("Plz 0000 To 9999 value Enter ........")
                else:
                    self.year = y
                    break
        ## method for aday ands cnttract days
        def adayDays(self, n):
            ## aday days to date day
            nd = self.day + n
            print(nd)
            ## check days subtract from date
            if nd == 0: ## check if days are 7  subtracted from 7 then,........
                if(self.year % 4 == 0):
                    if(self.month == 3):
                        self.day = 29
                        self.month -= 1
                        self.year = self. year
                else:
                    if(self.month == 3):
                        self.day = 28
                        self.month -= 1
                        self.year = self. year
                if  (self.month == 5) or (self.month == 7) or (self.month == 8) or (self.month == 10) or (self.month == 12):
                    self.day = 30
                    self.month -= 1
                    self.year = self. year
                       
                elif (self.month == 2) or (self.month == 4) or (self.month == 6) or (self.month == 9) or (self.month == 11):
                    self.day = 31
                    self.month -= 1
                    self.year = self. year
    
                elif(self.month == 1):
                    self.month = 12
                    self.year -= 1    
            ## nd == 0 if condition over
            ## after subtract days to day io goes into negative then
            elif nd < 0 :   
                n = abs(n)## return positive if no is negative
                for i in range (n,0,-1): ## 
                    
                    if self.day == 0:
    
                        if self.month == 1:
                            self.day = 30
                            
                            self.month = 12
                            self.year -= 1
                        else:
                            self.month -= 1
                            if(self.month == 1) or (self.month == 3)or (self.month == 5) or (self.month == 7) or (self.month == 8) or (self.month == 10) or (self.month ==12):
                                self.day = 30
                            elif(self.month == 4)or (self.month == 6) or (self.month == 9) or (self.month == 11):
                                self.day = 29
                            elif(self.month == 2):
                                if(self.year % 4 == 0):
                                    self.day == 28
                                else:
                                    self.day == 27
                    else:
                        self.day -= 1
    
            ## enf of elif negative days
            ## adaying days to DATE
            else:
                cnt = 0
                while (True):
    
                    if self.month == 2:  # check leap year
                        
                        if(self.year % 4 == 0):
                            if(nd > 29):
                                cnt = nd - 29
                                nd = cnt
                                self.month += 1
                            else:
                                self.day = nd
                                break
                    ## if not leap year then
                        else:  
                        
                            if(nd > 28):
                                cnt = nd - 28
                                nd = cnt
                                self.month += 1
                            else:
                                self.day = nd
                                break
                    ## checking month other than february month
                    elif(self.month == 1) or (self.month == 3) or (self.month == 5) or (self.month == 7) or (self.month == 8) or (self.month == 10) or (self.month == 12):
                        if(nd > 31):
                            cnt = nd - 31
                            nd = cnt
    
                            if(self.month == 12):
                                self.month = 1
                                self.year += 1
                            else:
                                self.month += 1
                        else:
                            self.day = nd
                            break
    
                    elif(self.month == 4) or (self.month == 6) or (self.month == 9) or (self.month == 11):
                        if(nd > 30):
                            cnt = nd - 30
                            nd = cnt
                            self.month += 1
    
                        else:
                            self.day = nd
                            break
                    ## end of month condition
            ## end of while loop
        ## end of else condition for adaying days
        def formatDate(self,frmt):
    
            if(frmt == 1):
                ff=str(self.day)+"-"+str(self.month)+"-"+str(self.year)
            elif(frmt == 2):
                ff=str(self.month)+"-"+str(self.day)+"-"+str(self.year)
            elif(frmt == 3):
                ff =str(self.year),"-",str(self.month),"-",str(self.day)
            elif(frmt == 0):
                print("Thanky You.....................")
                
            else:
                print("Enter Correct Choice.......")
            print(ff)
                
                
    
    dt = myDate()
    nday = int(input("Enter No. For Aday or SUBTRACT Days :: "))
    dt.adayDays(nday)
    print("1 : day-month-year")
    print("2 : month-day-year")
    print("3 : year-month-day")
    print("0 : EXIT")
    frmt = int (input("Enter Your Choice :: "))
    dt.formatDate(frmt)
    
        enter code here
    
    推荐文章