Python 3 Как форматировать в гггг-мм-ддчч: мм: ссз
Я новичок в Python, и я не могу найти свой конкретный ответ в Интернете. Мне нужно отформатировать временную метку в этот точный формат, чтобы включить 'T', 'Z', а не суб или милисекунды, например, гггг-мм-ддтчч: мм: сс Z, т.е. 2019-03-06T11:22:00Z. Есть много вещей при разборе этого формата, но ничего о форматировании таким образом. Единственный способ, которым я чуть не заставил его работать, - это дополнительные секунды, которые мне не нужны. Я пытался использовать стрелки и читать их документацию, но не смог заставить что-либо работать. Любая помощь будет оценена.
4 ответа
Пытаться datetime
библиотека
import datetime
output_date = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
print(output_date)
Обратитесь к документации здесь
Быть осторожен. Просто потому, что дату можно отформатировать так, чтобы она выглядела как UTC, не означает, что она точна.
В ISO 8601 "Z" означает "время зулу" или UTC ("+00:00"). Хотя местное время обычно обозначается смещением от UTC. Хуже того, эти смещения могут меняться в течение года из-за перехода на летнее время (DST).
Поэтому, если вы не живете в Англии зимой или в Исландии летом, скорее всего, вам не повезло работать с UTC локально, и ваши временные метки будут совершенно неправильными.
Python3.8
from datetime import datetime, timezone
# a naive datetime representing local time
naive_dt = datetime.now()
# incorrect, local (MST) time made to look like UTC (very, very bad)
>>> naive_dt.strftime("%Y-%m-%dT%H:%M:%SZ")
'2020-08-27T20:57:54Z' # actual UTC == '2020-08-28T02:57:54Z'
# so we'll need an aware datetime (taking your timezone into consideration)
# NOTE: I imagine this works with DST, but I haven't verified
aware_dt = naive_dt.astimezone()
# correct, ISO-8601 (but not UTC)
>>> aware_dt.isoformat(timespec='seconds')
'2020-08-27T20:57:54-06:00'
# lets get the time in UTC
utc_dt = aware_dt.astimezone(timezone.utc)
# correct, ISO-8601 and UTC (but not in UTC format)
>>> utc_dt.isoformat(timespec='seconds')
'2020-08-28T02:57:54+00:00'
# correct, UTC format (this is what you asked for)
>>> date_str = utc_dt.isoformat(timespec='seconds')
>>> date_str.replace('+00:00', 'Z')
'2020-08-28T02:57:54Z'
# Perfect UTC format
>>> date_str = utc_dt.isoformat(timespec='milliseconds')
>>> date_str.replace('+00:00', 'Z')
'2020-08-28T02:57:54.640Z'
Я просто хотел проиллюстрировать некоторые вещи выше, есть гораздо более простые способы:
from datetime import datetime, timezone
def utcformat(dt, timespec='milliseconds'):
"""convert datetime to string in UTC format (YYYY-mm-ddTHH:MM:SS.mmmZ)"""
iso_str = dt.astimezone(timezone.utc).isoformat('T', timespec)
return iso_str.replace('+00:00', 'Z')
def fromutcformat(utc_str, tz=None):
iso_str = utc_str.replace('Z', '+00:00')
return datetime.fromisoformat(iso_str).astimezone(tz)
now = datetime.now(tz=timezone.utc)
# default with milliseconds ('2020-08-28T02:57:54.640Z')
print(utcformat(now))
# without milliseconds ('2020-08-28T02:57:54Z')
print(utcformat(now, timespec='seconds'))
>>> utc_str1 = '2020-08-28T04:35:35.455Z'
>>> dt = fromutcformat(utc_string)
>>> utc_str2 = utcformat(dt)
>>> utc_str1 == utc_str2
True
# it even converts naive local datetimes correctly (as of Python 3.8)
>>> now = datetime.now()
>>> utc_string = utcformat(now)
>>> converted = fromutcformat(utc_string)
>>> now.astimezone() - converted
timedelta(microseconds=997)
Благодаря skaul05 мне удалось получить нужный код, это
date = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ") печать (дата)
С помощью строк f вы можете сократить его до:
из даты и времени импортировать дату и время
f'{datetime.now():%Y-%m-%dT%H:%M:%SZ}'
Кредиты идут на Как мне превратить дату и время python в строку с датой в читаемом формате?.