【问题标题】:Change to the previous day date in python在python中更改为前一天的日期
【发布时间】:2018-02-09 15:58:16
【问题描述】:

我正在编写我的 python 脚本以从按钮对象中获取字符串,以便我可以使用它来设置日期格式以及从字符串中获取的时间以将其存储在列表中。当我从按钮对象中获取字符串时,我想为每个字符串设置日期,例如:29/08/2017 11:30PM30/08/2017 12:00AM30/08/2017 12:30AM

当我尝试这个时:

if day_date >= 0 and day_date <= 6:
   if epg_time3 == '12:00AM':
      if day_date > 0:  
         currentday = datetime.datetime.now() + datetime.timedelta(days = 0)
         nextday = datetime.datetime.now() + datetime.timedelta(days = self.program_day)

         if currentday != nextday:
            epg_time_1 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)
            epg_time_2 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)
            epg_time_3 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)
        elif currentday == nextday:
             epg_time_1 = datetime.datetime.now() + datetime.timedelta(days = self.program_day)
             epg_time_2 = datetime.datetime.now() + datetime.timedelta(days = self.program_day - 1)
             epg_time_3 = datetime.datetime.now() + datetime.timedelta(days = self.program_day - 1)

它将显示输出:

self.epg_time_1
['29/08/2017 11:00PM']
self.epg_time_2
['29/08/2017 11:30PM']
self.epg_time_3
['29/08/2017 12:00AM']

当我再次调用 EPG_Times 函数时,它会显示如下输出:

self.epg_time_1
['30/08/2017 11:00PM']
self.epg_time_2
['30/08/2017 11:30PM']
self.epg_time_3
['30/08/2017 12:00AM']

应该是:

self.epg_time_1
['30/08/2017 11:00PM']
self.epg_time_2
['30/08/2017 11:30PM']
self.epg_time_3
['31/08/2017 12:00AM']

正如您所见,时间 12:00AM 是第二天,所以我想将其设置为 31 而不是 30。我已经从days = self.program_day + 1 更改为days = self.program_day - 1,但是当字符串从变量epg_time_1epg_time_2epg_time_3 中显示11:00PM11:30PM12:00AM 时,它会显示这样的输出:

self.epg_time_1
['30/08/2017 11:00PM']
self.epg_time_2
['30/08/2017 11:30PM']
self.epg_time_3
['30/08/2017 12:00AM']

这里是完整的代码:

self.program_day = list()

def EPG_Times(self):
     self.epg_time_1 = list()
     self.epg_time_2 = list()
     self.epg_time_3 = list()
     epg_time1 = str(self.getControl(344).getLabel())
     epg_time2 = str(self.getControl(345).getLabel())
     epg_time3 = str(self.getControl(346).getLabel())
     day_date = self.program_day
     day = ''
     month = ''
     year = ''    

     if day_date >= 0 and day_date <= 6:
         if epg_time3 == '12:00AM':    

            if day_date == 0:
                if epg_time1 == '12:00AM':
                   epg_time_1 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)
                   epg_time_2 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)
                   epg_time_3 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)
                 else:
                     epg_time_1 = datetime.datetime.now() + datetime.timedelta(days = self.program_day)
                     epg_time_2 = datetime.datetime.now() + datetime.timedelta(days = self.program_day)
                     epg_time_3 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)

             else:                      
                 currentday = datetime.datetime.now() + datetime.timedelta(days = 0)
                 nextday = datetime.datetime.now() + datetime.timedelta(days = self.program_day)

                 if currentday != nextday:
                    epg_time_1 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)
                    epg_time_2 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)
                    epg_time_3 = datetime.datetime.now() + datetime.timedelta(days = self.program_day + 1)
                 elif currentday == nextday:
                     epg_time_1 = datetime.datetime.now() + datetime.timedelta(days = self.program_day)
                     epg_time_2 = datetime.datetime.now() + datetime.timedelta(days = self.program_day - 1)
                     epg_time_3 = datetime.datetime.now() + datetime.timedelta(days = self.program_day - 1)


              epg1_day = epg_time_1.strftime("%d")
              epg1_month = epg_time_1.strftime("%m")
              epg1_year = epg_time_1.strftime("%Y")
              epg2_day = epg_time_2.strftime("%d")
              epg2_month = epg_time_2.strftime("%m")
              epg2_year = epg_time_2.strftime("%Y")
              epg3_day = epg_time_2.strftime("%d")
              epg3_month = epg_time_2.strftime("%m")
              epg3_year = epg_time_2.strftime("%Y")
              half_hour = str(epg1_day + "/" + epg1_month + "/" + epg1_year + " " + epg_time1)
              one_hour = str(epg2_day + "/" + epg2_month + "/" + epg2_year + " " + epg_time2)
              one_hour_half = str(epg3_day + "/" + epg3_month + "/" + epg3_year + " " + epg_time3)


         #Store the times and date in the list....
         self.epg_time_1.append(half_hour)
         self.epg_time_2.append(one_hour)
         self.epg_time_3.append(one_hour_half)

当我调用 EPG_time(self) 函数时,我希望代码将我从按钮对象获得的每个字符串更改为前一天的日期。如果epg_time_1epg_time_2 显示字符串11:00PM11:30PM,我想将时间和日期设置为29/08/2017 11:00PM 用于epg_time_129/08/2017 11:30PM 用于epg_time_2。如果epg_time_3 显示字符串12:00AM,那么我想将其添加到带有时间30/08/2017 12:00AM 的第二天日期。

在接下来的 24 小时内,如果 epg_time_1epg_time_2 显示字符串 11:00PM11:30PM,我想为 epg_time_130/08/2017 11:30PM 设置时间和日期为 30/08/2017 11:00PM epg_time_2。如果epg_time_3 显示字符串12:00AM,那么我想将时间设置为第二天日期1/09/2017 12:00AM

如果epg_time_1epg_time_2 显示字符串11:30PM12:00AM,我想更改为epg_time_1 的上一个日期,即29/08/2017 11:30PM30/08/2017 12:00AM。这取决于我将字符串存储在列表中的时间和日期。

你能告诉我一个例子,我如何在 python 中使用将日期更改为前一个日期并添加到第二天的日期?

【问题讨论】:

  • 你能把这段文字合并一下吗?看来您真正需要的只是使用strptime 将您的字符串转换为日期时间。日期变化的所有逻辑都将由 datetime 模块本身处理。
  • 对,我可能可以把一些东西放在一起作为例子,但我认为不可能从所呈现的内容中正确回答你的问题。我将不得不做出一些假设;你得到一个代表不同日期时间的 3 个字符串的列表,你需要在这些字符串中添加一个常数因子(介于 1 到 6 之间),并且你希望日期时间反映这种变化?

标签: python string python-2.7 datetime


【解决方案1】:

您的问题中有很多文字,很难准确指出问题所在。但是,它似乎归结为将可变天数添加到特定日期并确保该月份也被更新(如有必要)。

您应该使用datetime.datetime.strptime() 方法将您的日期转换为日期时间,这使得添加timedelta 变得很简单(您同时使用timedeltastrftime,但错过了这个关键方法)然后只需转换回一个字符串。

import datetime as dt

def add_days(datelist, days_to_add):
    # Convert the strings to datetime objects
    datelist = [dt.datetime.strptime(item, '%d/%m/%Y %I:%M%p') 
                for item in datelist]

    # Add a variable number of days (can be negative) to the datetimes
    mod_dates = [item + dt.timedelta(days=days_to_add) for item in datelist]

    # Convert back to strings
    str_dates = [dt.datetime.strftime(item, '%d/%m/%Y %I:%M%p')
                 for item in mod_dates]
    return str_dates

# This is the list right at the top of your question
a = ['29/08/2017 11:30PM', '30/08/2017 12:00AM', '30/08/2017 12:30AM']

print("Start:")
print(a)
b = add_days(a, 1)
print("After 1 call:")
print(b)
c = add_days(b, 1)
print("After 2 calls:")
print(c)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多