没有前导零的日期时间对象

Ped*_*ito 2 python datetime python-3.x

我已经遇到好几个答案(123关于)去除前导零python3 datetime对象。

投票最多的答案之一指出:

在 Windows 上,您将使用 #,例如 %Y/%#m/%#d

上面的代码对我不起作用。我还尝试了 Linux 解决方案,它使用了-而不是#,但没有成功。

代码

loop_date = "1950-1-1"
date_obj = datetime.strptime(loop_date, '%Y-%m-%d') # or '%Y-%#m-%#d' which produces the errors below
date_obj += timedelta(days=1)
print(date_obj)
# This the prints `1954-01-02` but I need `1954-1-2`
Run Code Online (Sandbox Code Playgroud)

追溯:

Traceback (most recent call last):
  File "C:/collect_games.py", line 84, in <module>
    date_obj = datetime.strptime(loop_date, '%Y-%-m-%d')
  File "E:\Anaconda3\lib\_strptime.py", line 565, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "E:\Anaconda3\lib\_strptime.py", line 354, in _strptime
    (bad_directive, format)) from None
ValueError: '#' is a bad directive in format '%Y-%#m#%d'
Run Code Online (Sandbox Code Playgroud)

这个问题最pythonic的方法是什么?

Pat*_*ner 6

您混淆了解析(将字符串转换为 dt)和格式化(将 dt 转换为字符串)的格式:

这适用于linux(或通过http://pyfiddle.io在线):

import datetime 

dt = datetime.datetime.now()

# format datetime as string
print(datetime.datetime.strftime(dt, '%Y-%-m-%-d'))  # - acts to remove 0 AND as delimiter

# parse a string into a datetime object
dt2 = datetime.datetime.strptime("1022-4-09", '%Y-%m-%d')

print(dt2)
Run Code Online (Sandbox Code Playgroud)

输出:

2018-4-5
1022-04-09 00:00:00
Run Code Online (Sandbox Code Playgroud)

-格式化时字符串的作用是去除导致0 AND作为分隔符-解析只需要放置作为分隔符-解析在作品在任022%m


这适用于Windows (VS2017):

from datetime import datetime, timedelta

loop_date = "1950-1-1"
date_obj = datetime.strptime(loop_date, '%Y-%m-%d')
date_obj += timedelta(days=1)
print(date_obj)   # output the datetime-object

print(datetime.strftime(date_obj,'%Y-%#m-%#d'))  # output it formatted
Run Code Online (Sandbox Code Playgroud)

输出:

1950-01-02 00:00:00
1950-1-2
Run Code Online (Sandbox Code Playgroud)