2015-09-17 1 views
3

Я пытаюсь сериализовать datetime в API, но мне не нужны миллисекунды. То, что я хочу здесь: https://en.wikipedia.org/wiki/ISO_8601 - "2015-09-14T17:51:31+00:00"Печать даты и времени в формате ISO без миллисекунд

tz = pytz.timezone('Asia/Taipei') 
dt = datetime.datetime.now() 
loc_dt = tz.localize(dt) 

Попробуйте A:

loc_dt.isoformat() 
>> '2015-09-17T10:46:15.767000+08:00' 

Try B:

loc_dt.strftime("%Y-%m-%dT%H:%M:%S%z") 
>> '2015-09-17T10:46:15+0800' 

Последнее один почти идеально, за исключением, что это отсутствует двоеточие в часовом поясе часть. Как я могу решить эту проблему без строковой манипуляции (удаление миллисекунд или добавление двоеточия)?

+0

Я бы предпочел форматной строки решение, потому что это то, что я могу легко хлопнуть в к сериализатору. Однако я не вижу ничего полезного на строковой странице формата strftime. –

+0

ISO8601 допускает использование вторых фрагментов. Попробуйте удалить фрагмент перед форматированием строки –

+0

несвязанный: код может завершиться неудачно во время переходов DST, вместо этого используйте 'loc_dt = datetime.now (tz)'. – jfs

ответ

4

Вы можете заменить микросекунд с 0 и использовать isoformat:

import pytz 
from datetime import datetime 
tz = pytz.timezone('Asia/Taipei') 
dt = datetime.now() 
loc_dt = tz.localize(dt).replace(microsecond=0) 
print loc_dt.isoformat() 
2015-09-17T19:12:33+08:00 

Если вы хотите сохранить loc_dt как это сделать замену при выводе:

loc_dt = tz.localize(dt) 
print loc_dt.replace(microsecond=0).isoformat() 

Как прокомментировал вы бы лучше проходя tz к datetime.now в:

dt = datetime.now(tz) 

Причины обсуждаются в pep-0495, вы также можете добавить Assert, чтобы поймать любые ошибки при выполнении замены:

ssert loc_dt.resolution >= timedelta(microsecond=0) 
+1

Wow , это странно с точки зрения парсера. Если по какой-либо причине микросекунда равна 0, она полностью исключается из вывода? Если минута или секунда равна нулю, она не опускается. –

+0

Да, если вы замените миллисекунды на 0, то ваше время будет иметь значение 'datetime.datetime (2015, 9, 17, 12, 33, 46, tzinfo = ) 'так что вызов isoformat просто работает с тем, что есть –

+2

Анализ: https://stackoverflow.com/questions/127803/how-to-parse-an-iso-8601-formatted-date-in-python Невероятно !!! –