Python 自定义日期时间(?)格式处理

dem*_*rgy 0 python time datetime date strptime

假设我有一个字符串表示一周中的天数:

例如“52300”,表示一周的第 5 天(星期五),23 小时 00 分钟。

我如何将它解析为 time 或 datetime 对象以添加 timedelta(hours=3) 并将其恢复为这种奇怪的格式?预期输出是“60200”字符串。

我试过了:

tow_str = '52300'
tow = datetime.datetime.strptime(tow_str, "%w%H%M") + datetime.timedelta(hours=3)
print(tow.strftime("%w%H%M"))
Run Code Online (Sandbox Code Playgroud)

返回 '​​20200' 而不是 '60200'

Mar*_*ers 5

%w准确解析日期需要包含日期本身,否则日期设置为 1900-01-01:

>>> import datetime
>>> tow_str = '52300'
>>> datetime.datetime.strptime(tow_str, "%w%H%M")
datetime.datetime(1900, 1, 1, 23, 0)
Run Code Online (Sandbox Code Playgroud)

1当格式化回字符串时,你总是会得到:

>>> datetime.datetime.strptime(tow_str, "%w%H%M").strftime("%w%H%M")
'12300'
Run Code Online (Sandbox Code Playgroud)

没有约会,%w是没有意义的。

您可以根据今天的日期从工作日生成一个日期,并且只解析时间:

def nearest_date_for_weekday(weekday):
    today = datetime.date.today()
    return today + datetime.timedelta(days=weekday - today.weekday())

parsed_date = datetime.datetime.combine(
    nearest_date_for_weekday(int(tow_str[0])), 
    datetime.datetime.strptime(tow_str[1:], '%H%M').time())

print parsed_date.strftime('%w%H%M')
Run Code Online (Sandbox Code Playgroud)

所以这会产生一个完整的datetime对象,所以格式化回一个字符串为 提供了一个有意义的值%w