如何将日期字符串转换为ISO8601标准?

Sac*_*ode 3 python datetime python-dateutil

使用dateutil我能够生成类型的ISO8601, YYYY-MM-DDThh:mm:ssTZD但我想要格式,'YYYY-MM-DDThh:mm:ss.sssTZD'例如'2015-05-13T18:05:55.320-07:00'

我的代码是

from datetime import datetime
from dateutil.parser import *
from dateutil.tz import *
import dateutil
import time

ts = time.time()
utc_offset = (datetime.fromtimestamp(ts) -
           datetime.utcfromtimestamp(ts)).total_seconds()

now = parse("11/10/09 11:20 PM")
now = now.replace(tzinfo=tzoffset('PDT', utc_offset))
Run Code Online (Sandbox Code Playgroud)

和输出是2009-11-10T23:20:00-07:00 如何获得输出的2009-11-10T23:20:00.000-07:00

cba*_*are 6

Python的datetime.strftime方法可以打印微秒:

ISO_FORMAT_MICROS = "%Y-%m-%dT%H:%M:%S.%f%z"
now.strftime(ISO_FORMAT_MICROS)
Run Code Online (Sandbox Code Playgroud)

回报

'2009-11-10T23:20:00.000000-0700'
Run Code Online (Sandbox Code Playgroud)

舍入到微秒

毫秒部分有点棘手.以下代码是RoadieRich解决方案的改进:

from datetime import datetime, timedelta

def datetime_to_iso(dt):
    fmt = "{time.year:04}-{time.month:02}-{time.day:02}T{time.hour:02}:{time.minute:02}:{time.second:02}.{millisecond:03}{tz}"

    ## handle rounding up to the next second
    if dt.microsecond >= 999500:
        dt -= timedelta(microseconds=dt.microsecond)
        dt += timedelta(seconds=1)

    return fmt.format(time=dt, millisecond=int(round(dt.microsecond/1000.0)), tz=dt.strftime("%z"))
Run Code Online (Sandbox Code Playgroud)

例如:

In [130]: d1 = datetime(2015,03,15,2,05,59,999999)

In [131]: datetime_to_iso(d1)
Out[131]: '2015-03-15T02:06:00.000'

In [132]: d2 = datetime(2015,03,15,2,05,59,456789)

In [133]: datetime_to_iso(d2)
Out[133]: '2015-03-15T02:05:59.457'
Run Code Online (Sandbox Code Playgroud)