Как узнать текущее время в Python

2892

Какой модуль / метод используется для получения текущего времени?

user46646
источник
пожалуйста, обратите внимание, что большинство проголосовавших ответов относятся к датам timezoneoe-naive date, в то время как мы видим, что в производственной среде все больше и больше сервисов по всему миру соединяются вместе, а дата-время с учетом часовых поясов становится необходимым стандартом
Sławomir Lenart

Ответы:

3055

Использование:

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2009, 1, 6, 15, 8, 24, 78915)

>>> print(datetime.datetime.now())
2009-01-06 15:08:24.789150

И просто время:

>>> datetime.datetime.now().time()
datetime.time(15, 8, 24, 78915)

>>> print(datetime.datetime.now().time())
15:08:24.789150

Смотрите документацию для получения дополнительной информации.

Чтобы сохранить набор текста, вы можете импортировать datetimeобъект из datetimeмодуля:

>>> from datetime import datetime

Затем удалите ведущую datetime.из всего вышеперечисленного.

Харли Холкомб
источник
25
Было бы хорошо, если бы этот ответ охватывал часовые пояса (например, UTC) и, возможно, начинался бы с time.time ().
Грег Линдал
4
@Toskan формат не был частью вопроса, поэтому он не должен быть частью ответа. Уже есть ссылка на дополнительную документацию модуля, которая содержит такие вещи, как форматирование.
JiyuuSensei
В какой версии Python был дан первоначальный ответ? Просто набрав datetime.datetime.now()в моей интерактивной консоли Python 2.7 (IronPython еще не обновился), я получаю то же поведение, что и в новом примере, использованном print()в ответе. Я не повторил успешно то, что показывает исходный ответ (datetime.datetime (2009, 1, 6, 15, 8, 24, 78915)). (Не то, чтобы я действительно этого хотел, поведение print () предпочтительнее, но мне любопытно.)
RTHarston
@BobVicktor: Python 2.7, 3.7 и 3.8 все дают одинаковое поведение для меня, не уверен, что вы видите.
Harley
@HarleyHolcombe Хм ... может быть, это вещь IronPython? Когда я datetime.now()print(datetime.now())
набираю
956

Вы можете использовать time.strftime():

>>> from time import gmtime, strftime
>>> strftime("%Y-%m-%d %H:%M:%S", gmtime())
'2009-01-05 22:14:39'
Шон Джеймс
источник
48
Это лучше / хуже, чем ответ @ ParaMeterz ниже? Почему мы должны использовать timeмодуль против datetimeмодуля?
Натан
3
Это не возвращает текущий час моего компьютера.
Саид
5
Это время UTC, отличающееся от модуля datetime
Voyager
5
@Saeed: используйте функцию localtime()вместо, gmtime()чтобы получить ваше местное время.
Jeyekomon
3
@frank Смотрите связанный вопрос по datetimeсравнению с time.
Packard CPW
622
from datetime import datetime
datetime.now().strftime('%Y-%m-%d %H:%M:%S')

Для этого примера вывод будет таким: '2013-09-18 11:16:32'

Вот список strftimeдиректив .

ParaMeterz
источник
456

Аналогичен ответу Харли , но используйте str()функцию для быстрого, немного грязного, чуть более удобочитаемого формата:

>>> from datetime import datetime
>>> str(datetime.now())
'2011-05-03 17:45:35.177000'
луч
источник
13
Все, что он просит, это узнать текущее время, а не отображать его.
pppery
@ppperry, тогда просто назначьте переменную для ответа Рэя, например: myTime = str (datetime.now ()) .
Лукас
2
Не имеет значения; шаг "str" ​​не входит в
суть
4
@pppery Также опера не говорит, что речь идет не о получении строки времени. Оператор вообще не говорит, что они хотят делать со временем, так почему плохо показывать, как превратить его в строку? Большинство ответов говорят о получении строки из времени, так что, похоже, это общий случай использования, так зачем выделять ответ Рэя? Какой смысл просто получать время, не зная, как с этим что-то сделать? Вы можете напечатать это или сделать математику на нем, и только несколько ответов показывают, как сделать это на математике, поэтому я думаю, что печать / получение строки - обычное использование. ;-) (я знаю, что это то, для чего я пришел.)
RTHarston
1
Тот факт, что в этом ответе содержится более 440 голосов, говорит о том, что незначительное добавление метода строк было полезно многим людям.
Джон
361

Как узнать текущее время в Python?

timeмодуль

timeМодуль обеспечивает функции , которые говорит нам время в «секундах с начала эпохи», а также другие коммунальные услуги.

import time

Unix Epoch Time

Это формат, в котором вы должны получить временные метки для сохранения в базах данных. Это простое число с плавающей запятой, которое можно преобразовать в целое число. Это также хорошо для арифметики в секундах, так как представляет количество секунд с 1 января 1970 года 00:00:00, и это свет памяти относительно других представлений времени, которые мы будем смотреть дальше:

>>> time.time()
1424233311.771502

Эта временная метка не учитывает високосных секунд, поэтому она не линейна - високосные секунды игнорируются. Таким образом, хотя он не эквивалентен международному стандарту UTC, он близок, и, следовательно, довольно хорош для большинства случаев ведения учета.

Однако это не идеально для планирования человека. Если у вас есть будущее событие, которое вы хотите провести в определенный момент времени, вам нужно сохранить это время со строкой, которую можно проанализировать в объекте datetime или сериализованном объекте datetime (они будут описаны позже).

time.ctime

Вы также можете представлять текущее время так, как предпочитает ваша операционная система (что означает, что оно может меняться при изменении системных настроек, поэтому не полагайтесь на то, что оно будет стандартным для всех систем, как я ожидал от других) , Это обычно удобно для пользователя, но обычно не приводит к строкам, которые можно сортировать в хронологическом порядке:

>>> time.ctime()
'Tue Feb 17 23:21:56 2015'

Вы также можете перевести метки времени в удобочитаемую форму с помощью ctime:

>>> time.ctime(1424233311.771502)
'Tue Feb 17 23:21:51 2015'

Это преобразование также не подходит для ведения записей (за исключением текста, который будет анализироваться только людьми - и с улучшенным оптическим распознаванием символов и искусственным интеллектом, я думаю, число этих случаев уменьшится).

datetime модуль

datetimeМодуль также весьма полезно здесь:

>>> import datetime

datetime.datetime.now

Метод datetime.nowкласса, который возвращает текущее время. Он использует time.localtimeбез информации о часовом поясе (если не указан, в противном случае см. Часовой пояс ниже). Он имеет представление (которое позволит вам воссоздать эквивалентный объект), отраженное в оболочке, но при печати (или приведении к a str) оно имеет читабельный (и почти ISO) формат, а лексикографическая сортировка эквивалентна хронологический вид:

>>> datetime.datetime.now()
datetime.datetime(2015, 2, 17, 23, 43, 49, 94252)
>>> print(datetime.datetime.now())
2015-02-17 23:43:51.782461

Дата и время-х utcnow

Вы можете получить объект datetime в глобальном стандарте времени UTC, выполнив это:

>>> datetime.datetime.utcnow()
datetime.datetime(2015, 2, 18, 4, 53, 28, 394163)
>>> print(datetime.datetime.utcnow())
2015-02-18 04:53:31.783988

UTC - это стандарт времени, который почти эквивалентен часовому поясу GMT. (Хотя GMT и UTC не меняются на летнее время, их пользователи могут переключаться на другие часовые пояса, такие как британское летнее время, летом).

дата и время

Однако ни один из объектов datetime, которые мы создали до сих пор, не может быть легко преобразован в различные часовые пояса. Мы можем решить эту проблему с помощью pytzмодуля:

>>> import pytz
>>> then = datetime.datetime.now(pytz.utc)
>>> then
datetime.datetime(2015, 2, 18, 4, 55, 58, 753949, tzinfo=<UTC>)

Эквивалентно, в Python 3 у нас есть timezoneкласс с присоединенным timezoneэкземпляром utc , который также делает объект часовой пояс осведомленным (но преобразование в другой часовой пояс без удобного pytzмодуля оставлено в качестве упражнения для читателя):

>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2015, 2, 18, 22, 31, 56, 564191, tzinfo=datetime.timezone.utc)

И мы видим, что мы можем легко преобразовать в часовые пояса из исходного объекта UTC.

>>> print(then)
2015-02-18 04:55:58.753949+00:00
>>> print(then.astimezone(pytz.timezone('US/Eastern')))
2015-02-17 23:55:58.753949-05:00

Вы также можете сделать наивный объект datetime осведомленным с помощью метода pytztimezone localizeили заменив атрибут tzinfo (with replace, это делается вслепую), но это более поздние варианты, чем лучшие практики:

>>> pytz.utc.localize(datetime.datetime.utcnow())
datetime.datetime(2015, 2, 18, 6, 6, 29, 32285, tzinfo=<UTC>)
>>> datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
datetime.datetime(2015, 2, 18, 6, 9, 30, 728550, tzinfo=<UTC>)

pytzМодуль позволяет нам сделать наши datetimeобъекты TIMEZONE осведомленными и конвертировать раз в сотни часовых поясов , доступных в pytzмодуле.

Можно было бы якобы сериализовать этот объект для УСВ и хранить , что в базе данных, но это потребовало бы гораздо больше памяти и более склонны к ошибкам , чем просто хранение времени Unix Epoch, который я продемонстрировал первый.

Другие способы просмотра времени гораздо более подвержены ошибкам, особенно при работе с данными, которые могут поступать из разных часовых поясов. Вы хотите, чтобы не было путаницы относительно того, для какого часового пояса была предназначена строка или сериализованный объект datetime.

Если вы отображаете время с Python для пользователя, он ctimeработает хорошо, не в таблице (обычно не очень хорошо сортируется), но, возможно, в часах. Однако я лично рекомендую при работе со временем в Python использовать либо время Unix, либо datetimeобъект UTC с учетом часового пояса .

Аарон Холл
источник
133

Делать

from time import time

t = time()
  • t - число с плавающей запятой, подходящее для измерения временного интервала.

Существует некоторая разница для платформ Unix и Windows.

MAXP
источник
Мой результат на Windows 10 home был 1576095264.2682993 - для Windows это могло бы просто дать время в секундах.
PythonMaster202
102
>>> from time import gmtime, strftime
>>> strftime("%a, %d %b %Y %X +0000", gmtime())
'Tue, 06 Jan 2009 04:54:56 +0000'

Это выводит текущий GMT в указанном формате. Также естьlocaltime() метод.

Эта страница имеет более подробную информацию.

Виджей Дев
источник
70

Все предыдущие ответы являются хорошими предложениями, но мне проще всего их использовать ctime():

In [2]: from time import ctime
In [3]: ctime()
Out[3]: 'Thu Oct 31 11:40:53 2013'

Это дает красиво отформатированное строковое представление текущего местного времени.

эфирный
источник
ОП спросил, как получить время, а не как его отобразить!
TheTechRobo36414519
59

Самый быстрый способ это:

>>> import time
>>> time.strftime("%Y%m%d")
'20130924'
Суперначо
источник
52

Если вам нужно текущее время как timeобъект:

>>> import datetime
>>> now = datetime.datetime.now()
>>> datetime.time(now.hour, now.minute, now.second)
datetime.time(11, 23, 44)
голубоватый
источник
36

.isoformat() находится в документации, но еще не здесь (это очень похоже на ответ @Ray Vega):

>>> import datetime
>>> datetime.datetime.now().isoformat()
'2013-06-24T20:35:55.982000'
emmagras
источник
35

Почему бы не спросить Военно-морскую обсерваторию США , официального хронометриста ВМС США?

import requests
from lxml import html

page = requests.get('http://tycho.usno.navy.mil/cgi-bin/timer.pl')
tree = html.fromstring(page.content)
print(tree.xpath('//html//body//h3//pre/text()')[1])

Если вы живете в округе Колумбия (как и я), задержка может быть не слишком плохой ...

C8H10N4O2
источник
18
@ C8H10N4O2 Хотя вы правы в том, что другие ответы предполагают, что ваш компьютер уже знает правильное время, этот ответ предполагает, что у компьютера есть подключение к Интернету, что вы находитесь в США, и что они никогда не снимут этот файл / изменить ссылку. В этом ответе гораздо больше предположений, чем принято. Все еще умный тем не менее
sudobangbang
34

Используя панд, чтобы узнать текущее время, можно решить проблему:

import pandas as pd
print(pd.datetime.now())
print(pd.datetime.now().date())
print(pd.datetime.now().year)
print(pd.datetime.now().month)
print(pd.datetime.now().day)
print(pd.datetime.now().hour)
print(pd.datetime.now().minute)
print(pd.datetime.now().second)
print(pd.datetime.now().microsecond)

Вывод:

2017-09-22 12:44:56.092642
2017-09-22
2017
9
22
12
44
56
92693
прудхви индана
источник
28

Это то, что я закончил с:

>>>from time import strftime
>>>strftime("%m/%d/%Y %H:%M")
01/09/2015 13:11

Кроме того, эта таблица является необходимой ссылкой для выбора соответствующих кодов формата, чтобы получить дату, отформатированную так, как вы этого хотите (из документации Python «datetime» здесь ).

таблица кодов формата strftime

Кристен Г.
источник
2
strftime(time_format)возвращает текущее местное время в виде строки, соответствующей заданному time_format. Примечание: time.strftime()и datetime.strftime()поддерживает различные наборы директив, например, %zне поддерживается time.strftime()в Python 2 .
Jfs
1
Лучше практиковать использование даты вместо времени?
Кристен Дж.
2
Многие timeфункции модуля являются тонкими обертками вокруг соответствующих функций C. datetimeэто более высокий уровень, и он обычно более переносим.
JFS
25

если вы уже используете numpy, то можете напрямую использовать функцию numpy.datetime64 ().

import numpy as np
str(np.datetime64('now'))

только на дату:

str(np.datetime64('today'))

или, если вы уже используете pandas, вы можете использовать функцию pandas.to_datetime ()

import pandas as pd
str(pd.to_datetime('now'))

или,

str(pd.to_datetime('today'))
Durjoy
источник
24

Вы можете использовать timeмодуль:

import time
print time.strftime("%d/%m/%Y")

>>> 06/02/2015

Использование капитала Yдает полный год, а использование yдаст06/02/15 .

Вы также можете использовать следующий код для увеличения времени:

time.strftime("%a, %d %b %Y %H:%M:%S")
>>> 'Fri, 06 Feb 2015 17:45:09'
Том
источник
20

datetime.now()возвращает текущее время как наивный объект datetime, который представляет время в местном часовом поясе. Это значение может быть неоднозначным, например, во время переходов DST («отступление»). Чтобы избежать двусмысленности, следует использовать часовой пояс UTC:

from datetime import datetime

utc_time = datetime.utcnow()
print(utc_time) # -> 2014-12-22 22:48:59.916417

Или объект с указанием часового пояса, к которому прикреплена соответствующая информация о часовом поясе (Python 3.2+):

from datetime import datetime, timezone

now = datetime.now(timezone.utc).astimezone()
print(now) # -> 2014-12-23 01:49:25.837541+03:00
JFS
источник
18
import datetime
date_time = datetime.datetime.now()

date = date_time.date()  # Gives the date
time = date_time.time()  # Gives the time

print date.year, date.month, date.day
print time.hour, time.minute, time.second, time.microsecond

Do dir(date)или любые переменные, включая пакет. Вы можете получить все атрибуты и методы, связанные с переменной.

theBuzzyCoder
источник
@snofty и @ user1016274, если import datetimeтогда это datetime.datetime.now()\ n, если from datetime import datetimeэто такdatetime.now()
theBuzzyCoder
18
>>> import datetime, time
>>> time = time.strftime("%H:%M:%S:%MS", time.localtime())
>>> print time
'00:21:38:20S'
user2030113
источник
Я думаю, что вы хотите сказать "datetime.now (). Strftime (...)"
hlin117
да, это можно сделать, как вы сказали. "Datetime.datetime.now () STRFTIME. (" % H:% M:% S:% МС ")"
user2030113
3
% MS не дает вам миллисекунд !!
ZF007
16

По умолчанию now()функция возвращает вывод в YYYY-MM-DD HH:MM:SS:MSформате. Используйте приведенный ниже пример скрипта, чтобы получить текущую дату и время в скрипте Python и распечатать результаты на экране. Создайте файл getDateTime1.pyс содержанием ниже.

import datetime

currentDT = datetime.datetime.now()
print (str(currentDT))

Вывод выглядит так:

2018-03-01 17:03:46.759624
Мадхусудхан Р
источник
15

Этот вопрос не нуждается в новом ответе только ради этого ... блестящая новая игрушка / модуль, однако, является достаточным оправданием. Это будучи библиотекой маятника , которая, похоже, выполняет те действия, которые предпринимала стрелка, за исключением тех недостатков, которые присущи стрелке.

Например, ответ на оригинальный вопрос:

>>> import pendulum
>>> print(pendulum.now())
2018-08-14T05:29:28.315802+10:00
>>> print(pendulum.now('utc'))
2018-08-13T19:29:35.051023+00:00

Есть много стандартов, которые нужно учитывать, включая множество RFC и ISO, о которых нужно беспокоиться. Когда-нибудь перепутать их; не беспокойтесь, взгляните немного. dir(pendulum.constants)Там есть нечто большее, чем форматы RFC и ISO.

Когда мы говорим местный, что мы имеем в виду? Ну, я имею в виду:

>>> print(pendulum.now().timezone_name)
Australia/Melbourne
>>>

Предположительно, большинство из вас значат где-то еще.

И на это идет. Короче говоря: маятник пытается сделать для даты и времени то, что запросы сделали для HTTP. Это стоит учитывать, особенно из-за простоты использования и обширной документации.

Бен
источник
14

Текущее время часового пояса

from datetime import datetime
import pytz

tz_NY = pytz.timezone('America/New_York') 
datetime_NY = datetime.now(tz_NY)
print("NY time:", datetime_NY.strftime("%H:%M:%S"))

tz_London = pytz.timezone('Europe/London')
datetime_London = datetime.now(tz_London)
print("London time:", datetime_London.strftime("%H:%M:%S"))

tz_India = pytz.timezone('Asia/India')
datetime_India = datetime.now(tz_India)
print("India time:", datetime_India.strftime("%H:%M:%S"))

#list timezones
pytz.all_timezones
Чемпион-бегун
источник
12

Попробуйте модуль стрелки с http://crsmithdev.com/arrow/ :

import arrow
arrow.now()

Или версия UTC:

arrow.utcnow()

Чтобы изменить его вывод, добавьте .format ():

arrow.utcnow().format('YYYY-MM-DD HH:mm:ss ZZ')

Для определенного часового пояса:

arrow.now('US/Pacific')

Час назад:

arrow.utcnow().replace(hours=-1)

Или если вы хотите суть.

arrow.get('2013-05-11T21:23:58.970460+00:00').humanize()
>>> '2 years ago'
Back2Basics
источник
5
остерегайтесь того, что arrow.now('Time/Zone')может произойти сбой в некоторых часовых поясах ( arrowиспользует dateutil, в котором нарушены utc -> локальные преобразования , которые используются внутри arrow.now(). Примечание: pytzтакой проблемы нет . Также есть другие проблемы, связанные с
jfs
12

Я хочу получить время с миллисекундами. Простой способ получить их:

import time, datetime

print(datetime.datetime.now().time())                         # 11:20:08.272239

# Or in a more complicated way
print(datetime.datetime.now().time().isoformat())             # 11:20:08.272239
print(datetime.datetime.now().time().strftime('%H:%M:%S.%f')) # 11:20:08.272239

# But do not use this:
print(time.strftime("%H:%M:%S.%f", time.localtime()), str)    # 11:20:08.%f

Но я хочу только миллисекунды , верно? Самый короткий способ получить их:

import time

time.strftime("%H:%M:%S", time.localtime()) + '.%d' % (time.time() % 1 * 1000)
# 11:34:23.751

Добавьте или удалите нули из последнего умножения, чтобы скорректировать количество десятичных знаков, или просто:

def get_time_str(decimal_points=3):
    return time.strftime("%H:%M:%S", time.localtime()) + '.%d' % (time.time() % 1 * 10**decimal_points)
y.selivonchyk
источник
1
Это работает в Python 3: time.strftime ("% H:% M:% S", time.localtime ()) + '. {}'. Format (int (time.time ()% 1 * 1000))
Грег Грэм
12

Вы можете использовать эту функцию, чтобы получить время (к сожалению, оно не говорит AM или PM):

def gettime():
    from datetime import datetime
    return ((str(datetime.now())).split(' ')[1]).split('.')[0]

Чтобы объединить часы, минуты, секунды и миллисекунды позже, вы можете использовать эти функции:

Час:

def gethour():
    from datetime import datetime
    return (((str(datetime.now())).split(' ')[1]).split('.')[0]).split(':')[0]

Минуты:

def getminute():
    from datetime import datetime
    return (((str(datetime.now())).split(' ')[1]).split('.')[0]).split(':')[1]

Во-вторых:

def getsecond():
    from datetime import datetime
    return (((str(datetime.now())).split(' ')[1]).split('.')[0]).split(':')[2]

миллисекунды:

def getmillisecond():
    from datetime import datetime
    return (str(datetime.now())).split('.')[1]
Ричи Бендалл
источник
11

Если вам нужна текущая временная метка в мс (например, для измерения времени выполнения), вы также можете использовать модуль timeit:

import timeit
start_time = timeit.default_timer()
do_stuff_you_want_to_measure()
end_time = timeit.default_timer()
print("Elapsed time: {}".format(end_time - start_time))
motagirl2
источник
9

Потому что никто еще не упомянул об этом, и это то, с чем я столкнулся недавно ... метод pyutz timezone from) () в сочетании с utcnow () для datetime - лучший способ найти полезное текущее время (и дату) в любом часовом поясе.

from datetime import datetime

import pytz


JST = pytz.timezone("Asia/Tokyo")


local_time = JST.fromutc(datetime.utcnow())

Если все, что вам нужно, это время, вы можете получить это с local_time.time().

kungphu
источник
Удивительно, но во всех приведенных выше ответах не упоминались часовые пояса. Вы также должны включить strftime, чтобы получить нужный формат.
GraphicalDot
1
Я не включил это, так как это уже было рассмотрено в других ответах (и форматирование отображения не было частью вопроса).
кунгфу
8

Вот то, что я использую, чтобы получить время без необходимости форматировать. Некоторым людям не нравится метод split, но он полезен здесь:

from time import ctime
print ctime().split()[3]

Он будет печататься в формате ЧЧ: ММ: СС.

Амро эласвар
источник
8

Этот вопрос относится к Python, но поскольку Django является одной из наиболее широко используемых сред Python, важно отметить, что если вы используете Django, вы всегда можете использовать timezone.now()вместоdatetime.datetime.now() . Первый - это часовой пояс, а второй - нет.

Посмотрите этот ТАК ответ и документ Django для деталей и обоснования timezone.now().

from django.utils import timezone

now = timezone.now()
Anupam
источник
7

Вы можете сделать это с помощью ctime ():

from time import time, ctime
t = time()
ctime(t)

вывод:

Sat Sep 14 21:27:08 2019

Эти выходные данные различаются, поскольку возвращаемая временная метка ctime()зависит от вашего географического положения.

Саи Киран Сангам
источник