使用毫秒将日期时间格式化为字符串

Jur*_*ocs 135 python datetime string-formatting

我希望datetime从日期开始有一个字符串,以毫秒为单位.这段代码对我来说很典型,我很想学会如何缩短它.

from datetime import datetime

timeformatted= str(datetime.utcnow())
semiformatted= timeformatted.replace("-","")
almostformatted= semiformatted.replace(":","")
formatted=almostformatted.replace(".","")
withspacegoaway=formatted.replace(" ","")
formattedstripped=withspacegoaway.strip()
print formattedstripped
Run Code Online (Sandbox Code Playgroud)

Jer*_*itz 296

要获取具有毫秒(秒后3位小数)的日期字符串,请使用以下命令:

from datetime import datetime

print datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]

>>>> OUTPUT >>>>
2020-05-04 10:18:32.926
Run Code Online (Sandbox Code Playgroud)

  • 如果微秒为0,则在Windows 2.7实现中,微秒不会打印出来,因此它会修剪秒数:( (12认同)
  • 唯一正确的答案.除非提问者意味着微秒 (8认同)
  • @gens 对于时间,截断优于四舍五入。例如,07:59:59.999 应截断为 07:59:59 或 07:59,而不是四舍五入到 08:00:00 或 08:00,就像 07:59:59 应截断为 07:59 而不是四舍五入一样至 08:00。 (8认同)
  • 注意,如果你想使用`import datetime`而不是`from datetime import datetime`,你将不得不使用:`datetime.datetime.utcnow().strftime("%H:%M:%S.% F")` (3认同)
  • 请注意,这会截断而不是四舍五入到毫秒 (3认同)
  • 正如 gens 所提到的,如果第一滴数 >=5,这会不会出错?事实上,如果 usec 部分 > 999500,那么你永远不会通过摆弄微秒部分来获得正确的时间 (3认同)

小智 27

使用Python 3.6,您可以使用:

from datetime import datetime
datetime.utcnow().isoformat(sep=' ', timespec='milliseconds')
Run Code Online (Sandbox Code Playgroud)

输出:

'2019-05-10 09:08:53.155'
Run Code Online (Sandbox Code Playgroud)

此处提供更多信息:https : //docs.python.org/3/library/datetime.html#datetime.datetime.isoformat

  • 对于时区也很有用: date = datetime(2019,5,10) date_with_tz = pytz.timezone('Europe/Rome').localize(date) date_with_tz.isoformat(sep='T', timespec='milliseconds') 输出: '2019-05-10T00:00:00.000+02:00' (2认同)

kni*_*tti 19

print datetime.utcnow().strftime('%Y%m%d%H%M%S%f')
Run Code Online (Sandbox Code Playgroud)

http://docs.python.org/library/datetime.html#strftime-strptime-behavior

  • 如果我们有时区怎么办? (12认同)
  • 仅供参考,这会将微秒打印为最后6位数字.在末尾添加`[:-3]`以删除最后3位数,使其仅显示毫秒数. (10认同)
  • 微秒可以小于6位,因此[:-3]打印出错误的毫秒数 (4认同)

Sam*_*ins 14

@Cabbi提出了一些问题,在某些系统上,微秒格式%f可能会给出"0",所以简单地删除最后三个字符是不可移植的.

以下代码使用毫秒仔细格式化时间戳:

from datetime import datetime
(dt, micro) = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f').split('.')
dt = "%s.%03d" % (dt, int(micro) / 1000)
print dt
Run Code Online (Sandbox Code Playgroud)

示例输出:

2016-02-26 04:37:53.133
Run Code Online (Sandbox Code Playgroud)

为了获得OP想要的确切输出,我们必须删除标点字符:

from datetime import datetime
(dt, micro) = datetime.utcnow().strftime('%Y%m%d%H%M%S.%f').split('.')
dt = "%s%03d" % (dt, int(micro) / 1000)
print dt
Run Code Online (Sandbox Code Playgroud)

示例输出:

20160226043839901
Run Code Online (Sandbox Code Playgroud)

  • 我实际上做的是:打印'%s.%03d'%(dt.strftime("%Y-%m-%d%H:%M:%S"),int(dt.microsecond/1000) )) (5认同)
  • 同意@cabbi,没有必要使用string和int来回转换 (2认同)

小智 7

大概是这样的:

import datetime
now = datetime.datetime.now()
now.strftime('%Y/%m/%d %H:%M:%S.%f')[:-3]  
# [:-3] => Removing the 3 last characters as %f is for microsecs.
Run Code Online (Sandbox Code Playgroud)

  • 正如其他答案中提到的,如果微秒为 0,则“.123455”部分可能会打印为“.0”,导致最后 3 个字符被截断以吃掉低秒数字和“.0”。 (2认同)

Waq*_*Ali 6

import datetime

# convert string into date time format.

str_date = '2016-10-06 15:14:54.322989'
d_date = datetime.datetime.strptime(str_date , '%Y-%m-%d %H:%M:%S.%f')
print(d_date)
print(type(d_date)) # check d_date type.


# convert date time to regular format.

reg_format_date = d_date.strftime("%d %B %Y %I:%M:%S %p")
print(reg_format_date)

# some other date formats.
reg_format_date = d_date.strftime("%Y-%m-%d %I:%M:%S %p")
print(reg_format_date)
reg_format_date = d_date.strftime("%Y-%m-%d %H:%M:%S")
print(reg_format_date)
Run Code Online (Sandbox Code Playgroud)

<<<<<< 输出>>>>>>

2016-10-06 15:14:54.322989    
<class 'datetime.datetime'>    
06 October 2016 03:14:54 PM    
2016-10-06 03:14:54 PM    
2016-10-06 15:14:54
Run Code Online (Sandbox Code Playgroud)