Учитывая следующее datetime:

d = datetime.datetime(2018, 10, 9, 8, 19, 16, 999578, tzinfo=dateutil.tz.tzoffset(None, 7200))

D.isoformat () приводит к строке:

'2018-10-09T08:19:16.999578+02:00'

Как я могу получить строку с миллисекундами вместо микросекунд:

'2018-10-09T08:19:16.999+02:00'

Функция strftime () здесь работать не будет:% z возвращает 0200 вместо 02:00 и имеет только% f для получения микросекунд, для миллисекунд нет заполнителя.

4
cytrinox 23 Окт 2018 в 11:12

2 ответа

Лучший ответ

Если часовой пояс без двоеточия в порядке, вы можете использовать

d = datetime.datetime(2018, 10, 9, 8, 19, 16, 999578, 
                      tzinfo=dateutil.tz.tzoffset(None, 7200))
s = d.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + d.strftime('%z')
# '2018-10-09T08:19:16.999+0200'

Для двоеточия вам нужно разделить часовой пояс и добавить его туда самостоятельно. %z не производит Z ни для UTC.


И Python 3.6 поддерживает timespec='milliseconds', так что вы должны это сделать:

try:
    datetime.datetime.now().isoformat(timespec='milliseconds')
    def milliseconds_timestamp(d):
        return d.isoformat(timespec='milliseconds')

except TypeError:
    def milliseconds_timestamp(d):
        z = d.strftime('%z')
        z = z[:3] + ':' + z[3:]
        return d.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + z

Учитывая последнее определение в Python 3.6,

>>> milliseconds_timestamp(d) == d.isoformat(timespec='milliseconds')
True

С участием

>>> milliseconds_timestamp(d)
'2018-10-09T08:19:16.999+02:00'
4
Antti Haapala 23 Окт 2018 в 08:38

Думаю, вы могли бы сделать это с помощью strftime?

d.strftime("%Y-%m-%dT%H:%M:%S.") + str(d.microsecond//1000)
-1
Sindri 23 Окт 2018 в 08:28
52944181