如何将日期字符串转换为 ISO8601 标准?
How to convert date string to ISO8601 standard?
使用 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))
输出为2009-11-10T23:20:00-07:00
我怎样才能得到像 2009-11-10T23:20:00.000-07:00
这样的输出
Python的datetime.strftime方法可以打印微秒:
ISO_FORMAT_MICROS = "%Y-%m-%dT%H:%M:%S.%f%z"
now.strftime(ISO_FORMAT_MICROS)
returns
'2009-11-10T23:20:00.000000-0700'
四舍五入到微秒
毫秒部分有点棘手。以下代码是 的细化:
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"))
例如:
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'
>>> now = datetime.now(tzoffset('EDT', -4*60*60))
>>> print(now.isoformat())
2015-05-15T07:08:34.478784-04:00
请注意,如果值为 0,isoformat
方法将省略微秒(如您的示例解析时间。如果您必须在输出中使用小数秒,请在格式字符串中使用 %f
:
>>> print(now.strftime("%y-%m-%dT%H:%M:%S.%f%z"))
15-05-15T07:35:00.000000-0400
如果您需要 毫秒 秒,则必须编写自己的格式化例程:
def format_time_with_milliseconds(time):
fmt = "{time.year:04}-{time.month:02}-{time.day:02}T{time.hour:02}:{time.minute:02}:{time.second:02}.{millisecond:03}{tz}"
return fmt.format(time=time, millisecond=int(round(time.microsecond/1000)), tz=time.strftime("%z"))
可以解析该格式的相同格式:
>>> from datetime import datetime
>>> ts='2015-05-13T18:05:55.320-0700'
>>> tf="%Y-%m-%dT%H:%M:%S.%f%z"
>>> dt=datetime.strptime(ts, tf)
>>> dt
datetime.datetime(2015, 5, 13, 18, 5, 55, 320000, tzinfo=datetime.timezone(datetime.timedelta(-1, 61200)))
也可以打印:
>>> dt.strftime(tf)
'2015-05-13T18:05:55.320000-0700'
但是请注意,tz 中缺少“:”。
您还可以使用 isoformat() 来打印您的目标:
>>> dt.isoformat()
2015-05-13T18:05:55.320000-07:00
使用 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))
输出为2009-11-10T23:20:00-07:00
我怎样才能得到像 2009-11-10T23:20:00.000-07:00
Python的datetime.strftime方法可以打印微秒:
ISO_FORMAT_MICROS = "%Y-%m-%dT%H:%M:%S.%f%z"
now.strftime(ISO_FORMAT_MICROS)
returns
'2009-11-10T23:20:00.000000-0700'
四舍五入到微秒
毫秒部分有点棘手。以下代码是
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"))
例如:
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'
>>> now = datetime.now(tzoffset('EDT', -4*60*60))
>>> print(now.isoformat())
2015-05-15T07:08:34.478784-04:00
请注意,如果值为 0,isoformat
方法将省略微秒(如您的示例解析时间。如果您必须在输出中使用小数秒,请在格式字符串中使用 %f
:
>>> print(now.strftime("%y-%m-%dT%H:%M:%S.%f%z"))
15-05-15T07:35:00.000000-0400
如果您需要 毫秒 秒,则必须编写自己的格式化例程:
def format_time_with_milliseconds(time):
fmt = "{time.year:04}-{time.month:02}-{time.day:02}T{time.hour:02}:{time.minute:02}:{time.second:02}.{millisecond:03}{tz}"
return fmt.format(time=time, millisecond=int(round(time.microsecond/1000)), tz=time.strftime("%z"))
可以解析该格式的相同格式:
>>> from datetime import datetime
>>> ts='2015-05-13T18:05:55.320-0700'
>>> tf="%Y-%m-%dT%H:%M:%S.%f%z"
>>> dt=datetime.strptime(ts, tf)
>>> dt
datetime.datetime(2015, 5, 13, 18, 5, 55, 320000, tzinfo=datetime.timezone(datetime.timedelta(-1, 61200)))
也可以打印:
>>> dt.strftime(tf)
'2015-05-13T18:05:55.320000-0700'
但是请注意,tz 中缺少“:”。
您还可以使用 isoformat() 来打印您的目标:
>>> dt.isoformat()
2015-05-13T18:05:55.320000-07:00