Час дати Python для рядка без мікросекундної складової


410

Я додаю часові рядки UTC до відповідей Bitbucket API, які наразі містять лише амстердамські (!) Часові рядки. Для узгодженості з часовими рядками UTC, поверненими в іншому місці, потрібний формат 2011-11-03 11:07:04(далі +00:00, але це не є німецьким).

Який найкращий спосіб створити такий рядок ( без компонента мікросекунди) з datetimeекземпляра з мікросекундним компонентом?

>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026

Я додам найкращий варіант, який мені трапився, як можливу відповідь, але, можливо, може бути і більш елегантне рішення.

Редагувати: Я мушу зазначити, що я фактично не друкую поточний час - я використовував datetime.nowкороткий приклад. Тому рішення не повинно вважати, що будь-які datetimeекземпляри, які він отримує, включатимуть мікросекундні компоненти.

Відповіді:


840

Якщо ви хочете відформатувати datetimeоб'єкт у певному форматі, який відрізняється від стандартного формату, то краще чітко вказати цей формат:

>>> datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 18:21:26'

Для пояснення директив див . Документаціюdatetime.strftime()% .


10
Колега просто зробив переконливий випадок, оскільки це правильний підхід. Вважайте мене переконаним.
davidchambers

3
Що було тим переконливим випадком - поставити це рішення над вашим рішенням, використовуючи datetime.replace?
matlehmann

13
@matlehmann: Звичайно, я не знаю аргументів колеги дачників. Однак я думаю, якщо ваш намір полягає в тому, щоб надрукувати дату в дуже конкретному форматі, ви повинні бути чітко про це. Код у цій відповіді зазначає "прийміть поточний час та відформатуйте його саме так". Код в іншій відповіді говорить "взяти поточний час, встановити мікросекунди на 0, а потім якось перетворити його в рядок".
Свен Марнах

3
+1, якщо бути чітким щодо строкового формату, уникає проблем, якщо стандартна конверсія datetime-str зміниться у майбутній версії Python
Alan Evangelista

2
@DylanYoung Вимога ОП полягає в тому, щоб надрукувати об'єкт дати в форматі, відмінному від стандартного формату, що повертається .isoformat(), який включає мікросекунд за замовчуванням. Якщо це те, що вам потрібно, будьте явні про це. Всі одразу зрозуміють, що робить цей код. Навряд чи хтось зрозуміє інший код, не дивлячись на документацію.
Свен Марнах

172
>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07

20
Я думаю, що це правильне рішення, оскільки воно читабельне, задокументоване та послідовне поведінку: " .isoformat([sep])- Поверніть рядок, що представляє дату та час у форматі ISO 8601, РРРР-ММ-DDTHH: MM: SS.mmmmmm або, якщо мікросекунда є 0, YYYY-MM-DDTHH: MM: SS "
Bengt

1
у моїй ситуації дата вже побудована, і мені потрібно було "перекрити" її другим. це ідеально, дякую.
Vigrond

1
Це найкраща відповідь!
Хавок

Дуже краще, ніж форматування чи аналіз рядків для порівняння, дякую.
Zach Young

69

У Python 3.6:

from datetime import datetime
datetime.datetime.now().isoformat(' ', 'seconds')
'2017-01-11 14:41:33'

https://docs.python.org/3.6/library/datetime.html#datetime.datetime.isoformat


4
Я думаю, що зараз, через 8 років з появою Python 3.6, це має бути прийнятою універсальною відповіддю. Це пропонує кращі для обох світів, про які сперечалися @DylanYoung та AlexanderMP на цій самій нитці тут
pfabri


47

Це так, як я це роблю. Формат ISO:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
# Returns: '2017-01-23T14:58:07'

Ви можете замінити "T", якщо ви не бажаєте формату ISO:

datetime.datetime.now().replace(microsecond=0).isoformat(' ')
# Returns: '2017-01-23 15:05:27'

Це схоже на мою відповідь. Чи є причина на користь .isoformat()більш unicode()?
Давидчам

1
Залежить від того, що ви хочете, якщо ви хочете використовувати представлення рядка python unicode(), і якщо ви хочете використовувати ISO-8601, використовуйтеisoformat()
radtek

Розумію. unicode()зручніше, ніж .isoformat().replace('T', ' '), звичайно. ;)
Давидчам

Я б просто застосував рішення Sven для неізо-формату, його більш чіткого: datetime.now (). Строка ("% Y-% m-% d% H:% M"), але заміна 'T' - просто інша шлях. Може бути найкращим рішенням, якщо вам потрібні і ISO, і дата Unicode.
radtek

isoformatприймає специфікатор роздільника, тому замінювати його не слід. просто робіть:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya

17

Ще один варіант:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 11:31:28'

За замовчуванням для цього використовується місцевий час, якщо вам потрібен UTC, ви можете використовувати наступне:

>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
'2011-11-03 18:32:20'

Знов, тому що ОП запитала про час, а не про дату.
Юрген А. Ерхард

15

Зберігайте перші 19 символів, які ви хотіли за допомогою нарізки:

>>> str(datetime.datetime.now())[:19]
'2011-11-03 14:37:50'

5
Це лише неправильно, оскільки до часових рядків може бути додана специфікація часового поясу, наприклад +05:30. Правильно було б str(now())[:19].
K3 --- rnc

1
@ K3 --- rnc: спасибі Оновлено за вашою пропозицією.
Стівен Румбальський

після року 10000буде пропущено
секунду

час покаже @diti;)
yǝsʞǝla

8

Я зазвичай роблю:

import datetime
now = datetime.datetime.now()
now = now.replace(microsecond=0)  # To print now without microsecond.

# To print now:
print(now)

вихід:

2019-01-13 14:40:28

7

Оскільки не всі datetime.datetimeекземпляри мають мікросекундний компонент (тобто, коли він дорівнює нулю), ви можете розділити рядок на "." і візьміть лише перший предмет, який завжди працюватиме:

unicode(datetime.datetime.now()).partition('.')[0]

3

Ми можемо спробувати щось на кшталт нижче

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]

Це поступається .isoformat(' ', 'seconds'), запропонованому в попередній відповіді.
davidchambers

1
Коли я намагаюсь запропонувати попередню відповідь, я отримую нижче помилку >>> datetime.datetime.now (). Isoformat ('', 'секунди') Traceback (останній дзвінок останній): Файл "<stdin>", рядок 1, у <module> TypeError: isoformat () бере щонайменше 1 аргумент (2 дані)
Абхішек Баджай

А, бачу. Він працює для мене в Python 3, але не в Python 2.
davidchambers

Я використовую версію python 3.4.3, в якій я бачу цю помилку. >>> datetime.datetime.now (). isoformat ('', 'секунди') Відстеження (останній останній виклик останній): Файл "<stdin>", рядок 1, в <module> TypeError: isoformat () займає максимум 1 аргумент (2 наведено)
Абхішек Баджай

1

Я вважав, що це найпростіший спосіб.

>>> t = datetime.datetime.now()
>>> t
datetime.datetime(2018, 11, 30, 17, 21, 26, 606191)
>>> t = str(t).split('.')
>>> t
['2018-11-30 17:21:26', '606191']
>>> t = t[0]
>>> t
'2018-11-30 17:21:26'
>>> 

datetime.datetime.now (). строковий час ("% Y-% m-% d% H:% M:% S") '2011-11-03 18:21:26' набагато простіше imo. Але легко - це не завжди найкраще
An0n

1

Це я використовую, тому що я можу зрозуміти і, отже, запам'ятати його краще (а також формат часу дати також можна налаштувати на основі вашого вибору):

import datetime
moment = datetime.datetime.now()
print("{}/{}/{} {}:{}:{}".format(moment.day, moment.month, moment.year,
                                 moment.hour, moment.minute, moment.second))

Блискуча. Проста, гнучка та незалежна від платформи (на відміну від стрімкінгу).
Endre Обидва
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.