我的另一个愚蠢的编程尝试。对于某事的开始日期和结束日期,这个美女搜索文件(该部分在示例中被简化,没有问题)并尝试将其转换为本地时间以用于恶意目的。 这是我设法放在一起的东西(记住,新手编码器在这里):
#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()似乎没有帮助,也许我用错了方法。如果有人决定帮助我那么请保持简单。我真的不介意代码是不是很优雅,我唯一的要求是它有效,我知道它为什么有效。
答案 0 :(得分:0)
找出错误的最佳方法之一就是遍历代码。首先,让我们记下几点:
x
之类的任何未被使用的变量。查看此规则,让我们编辑get_gmt
。要遵循这些规则,get_gmt
现在应包含gmt
,start_date
和end_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_date
和end_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
)。
以相同的方式继续处理代码 - 遍历每行代码。还要记住两点:
end_date
)时,你应该在某个地方使用它。如果您没有在任何地方使用它,那意味着您不需要它,或者您可能需要它在其他地方。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