日期时间问题

时间:2017-11-21 05:14:15

标签: python join datetime-format strptime

我的另一个愚蠢的编程尝试。对于某事的开始日期和结束日期,这个美女搜索文件(该部分在示例中被简化,没有问题)并尝试将其转换为本地时间以用于恶意目的。 这是我设法放在一起的东西(记住,新手编码器在这里):

#will need it later#
import datetime
#this part simulates other code that opens a 
#file for me. The format of date and time
#is preserved
mail_body = """
Maintenance Date/Time (Local): 
Nov 17 2017 00:01 CET - Nov 17 2017 06:00 CET
Maintenance Date/Time (GMT):
Nov 16 2017 23:30 GMT - Nov 17 2017 05:00 GMT"""

#Turning it all into list to be able to get important
# bits of text by using index later
word_list = mail_body.split()

# A dictionary to transform months into numbers
months = {
    "Jan":1,"Feb":2,"Mar":3,"Apr":4,
    "May":5,"Jun":6,"Jul":7,"Aug":8,
    "Sep":9,"Oct":10,"Nov":11,"Dec":12
    }

#Various lists    
start_date = []
start_date_local = []


# Will need that to convert GMT to my local GMT + 1
add_hour = datetime.timedelta(hours = 1)
gmt = word_list.index("(GMT):")

#Grabbing parts of the text I need by selecting
#index numbers
def get_gmt(x):
    start_date.extend(word_list[gmt + 1:gmt + 5])
    end_date.extend(word_list[gmt + 7:gmt + 11])
    #print (",".join(start_date))
    return (",".join(start_date))


#Attempting to add +1 hour in a safe way, program
#needs to know it's working with dates
def start_local(x):

#Where the pain starts.....must be string, not list
#Not really sure how to get around that
    start_date_local = datetime.datetime.strptime(start_date, "%m-%d-%Y %H:%M")
    start_date_local = start_date_local + add_hour
    return start_date_local


#Calling functions
get_gmt(word_list)
start_date
start_local(start_date)

问题始于.strptime()。我无法将start_date转换为strptime将接受的格式。是的,我已经在这些板上阅读了很多答案,还阅读了strptime的文档(不是我理解的)。 .join()似乎没有帮助,也许我用错了方法。如果有人决定帮助我那么请保持简单。我真的不介意代码是不是很优雅,我唯一的要求是它有效,我知道它为什么有效。

2 个答案:

答案 0 :(得分:0)

找出错误的最佳方法之一就是遍历代码。首先,让我们记下几点:

  1. 当函数使用变量时,变量应该是 作为参数传入或在函数内声明。 (注意:这确实掩盖了某些类型的变量,但对于初学者编码器,我强烈建议坚持使用)。
  2. 确保在函数内使用参数。你没有 想要使用x之类的任何未被使用的变量。
  3. 查看此规则,让我们编辑get_gmt。要遵循这些规则,get_gmt现在应包含gmtstart_dateend_date的声明。参数应为word_list

    def get_gmt(word_list):
       gmt = word_list.index("(GMT):")
       start_date = []
       end_date = []
       start_date.extend(word_list[gmt + 1:gmt + 5])
       end_date.extend(word_list[gmt + 7:gmt + 11])
       print(start_date)
       print(end_date)
       return (",".join(start_date))
    

    现在代码在一起,您可以看到首先初始化变量start_dateend_date,然后为两个列表调用函数extend一次。我们可以将它压缩为一个行声明和每个变量的初始化。这导致以下功能:

    def get_gmt(word_list):
       gmt = word_list.index("(GMT):")
       start_date = word_list[gmt + 1:gmt + 5]
       end_date = word_list[gmt + 7:gmt + 11]
       return (",".join(start_date))
    

    现在代码更简单了,让我们通过将调用get_gmt更改为print(get_gmt(word_list))来打印出此函数的返回值。这将打印出值Nov,16,2017,23:30,这是get_gmt返回的字符串。 strptime所需的格式为"%m-%d-%Y %H:%M"

    接下来让我们看一下此链接提供的TutorialsPoint示例:https://www.tutorialspoint.com/python/time_strptime.htm。如果我们使用上面列出的格式Nov,16,2017,23:30,那么让我们逐步完成每个部分。

    • Nov%b
    • 表示
    • 16%d%e表示(取决于如何表示1-9)
    • 2017%Y
    • 表示
    • 23:30%H:%M
    • 表示

    将它们组合在一起,因为您的示例是一个用逗号分隔的字符串,所以您可以使用模式%b,%d,%Y,%H:%M(或%b,%e,%Y,%H:%M)。

    以相同的方式继续处理代码 - 遍历每行代码。还要记住两点:

    1. 每当你声明一个变量(例如end_date)时,你应该在某个地方使用它。如果您没有在任何地方使用它,那意味着您不需要它,或者您可能需要它在其他地方。
    2. 当你有一个函数的返回值(例如get_gmt)时,你应该在某个地方使用它。您希望将返回值存储在变量中(如前一点所述)在某处使用变量。

答案 1 :(得分:0)

作为一个坚持不懈的人,我无法解决问题。由于将参数从一个函数传递到另一个函数无法解决问题,我完全摆脱了这些函数。当然,它们看起来很漂亮,确定你可以用它们做很多事情(可能),其他人可以更好地理解代码。如果它不起作用,它仍然是徒劳的。从好的方面来说,我已经设法绕着datetime.strptime,感谢Nupur Garg。这就是我想出的:

import datetime

mail_body = """
Maintenance Date/Time (Local): 
Nov 17 2017 00:01 CET - Nov 17 2017 06:00 CET
Maintenance Date/Time (GMT):
Nov 16 2017 23:30 GMT - Nov 17 2017 05:00 GMT"""


word_list = mail_body.split()

gmt = word_list.index("(GMT):")
start_date = word_list[gmt + 1:gmt + 5]
start_date = ",".join(start_date)
end_date = word_list[gmt + 7:gmt + 11]
end_date = ",".join(end_date)

add_hour = datetime.timedelta(hours = 1)
start_date_local = datetime.datetime.strptime(start_date, "%b,%d,%Y,%H:%M")
start_date_local = start_date_local + add_hour
print start_date_local
end_date_local = datetime.datetime.strptime(end_date, "%b,%d,%Y,%H:%M")
end_date_local = end_date_local + add_hour
print end_date_local