如何从日期中减去一天?

我有一个Python#0对象。减去一天的最佳方法是什么?

1004073 次浏览

您可以使用#0对象:

from datetime import datetime, timedelta    
d = datetime.today() - timedelta(days=days_to_subtract)

减去datetime.timedelta(days=1)

只是为了阐述一种替代方法和它有帮助的用例:

  • 从当前日期时间减去1天:
from datetime import datetime, timedeltaprint datetime.now() + timedelta(days=-1)  # Here, I am adding a negative timedelta
  • 在案件中有用,如果您想从当前日期时间中添加5天并减去5小时。即从现在起5天但少5小时的日期时间是多少?
from datetime import datetime, timedeltaprint datetime.now() + timedelta(days=5, hours=-5)

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

如果您的Python datetime对象是时区感知的,那么您应该小心避免DST转换周围的错误(或由于其他原因更改UTC偏移量):

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

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

例如,夏令时/夏令时结束于2014年11月2日星期日上午02:00:00在美国/Los_Angeles时区,因此如果:

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

然后day_agoyesterday不同:

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

#0模块自动处理:

>>> 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]>

也只是另一个不错的函数,我喜欢使用当我想计算,即第一/最后一天的最后一个月或其他相对时间增量等…

来自日期函数的relativedelta函数(对datetime lib的强大扩展)

import datetime as dtfrom 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

Genial箭头模块存在

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

输出:

2017-04-06T11:17:34.431397+00:002017-04-05T11:17:34.431397+00:00
class myDate:
def __init__(self):self.day = 0self.month = 0self.year = 0## for checking valid days month and yearwhile (True):d = int(input("Enter The day :- "))if (d > 31):print("Plz 1 To 30 value Enter ........")else:self.day = dbreak
while (True):m = int(input("Enter The Month :- "))if (m > 13):print("Plz 1 To 12 value Enter ........")else:self.month = mbreak
while (True):y = int(input("Enter The Year :- "))if (y > 9999 and y < 0000):print("Plz 0000 To 9999 value Enter ........")else:self.year = ybreak## method for aday ands cnttract daysdef adayDays(self, n):## aday days to date daynd = self.day + nprint(nd)## check days subtract from dateif nd == 0: ## check if days are 7  subtracted from 7 then,........if(self.year % 4 == 0):if(self.month == 3):self.day = 29self.month -= 1self.year = self. yearelse:if(self.month == 3):self.day = 28self.month -= 1self.year = self. yearif  (self.month == 5) or (self.month == 7) or (self.month == 8) or (self.month == 10) or (self.month == 12):self.day = 30self.month -= 1self.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 = 31self.month -= 1self.year = self. year
elif(self.month == 1):self.month = 12self.year -= 1## nd == 0 if condition over## after subtract days to day io goes into negative thenelif nd < 0 :n = abs(n)## return positive if no is negativefor i in range (n,0,-1): ##                
if self.day == 0:
if self.month == 1:self.day = 30                        
self.month = 12self.year -= 1else:self.month -= 1if(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 = 30elif(self.month == 4)or (self.month == 6) or (self.month == 9) or (self.month == 11):self.day = 29elif(self.month == 2):if(self.year % 4 == 0):self.day == 28else:self.day == 27else:self.day -= 1
## enf of elif negative days## adaying days to DATEelse:cnt = 0while (True):
if self.month == 2:  # check leap year                    
if(self.year % 4 == 0):if(nd > 29):cnt = nd - 29nd = cntself.month += 1else:self.day = ndbreak## if not leap year thenelse:                    
if(nd > 28):cnt = nd - 28nd = cntself.month += 1else:self.day = ndbreak## checking month other than february monthelif(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 - 31nd = cnt
if(self.month == 12):self.month = 1self.year += 1else:self.month += 1else:self.day = ndbreak
elif(self.month == 4) or (self.month == 6) or (self.month == 9) or (self.month == 11):if(nd > 30):cnt = nd - 30nd = cntself.month += 1
else:self.day = ndbreak## end of month condition## end of while loop## end of else condition for adaying daysdef 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