Python time.time() возвращает локальную или временную метку UTC?

Поддерживает ли time.time() в модуле времени Python системное время или время в UTC?

Ответ 1

Функция time.time() возвращает количество секунд с эпохи в секундах. Обратите внимание, что "эпоха" определяется как начало 1 января 1970 года в UTC. Таким образом, эпоха определяется в терминах UTC и устанавливает глобальный момент времени. Независимо от того, где вы находитесь "секунды прошлой эпохи" (time.time()) возвращает одно и то же значение в тот же момент.

Вот пример вывода, который я запускал на своем компьютере, также преобразовывая его в строку.

Python 2.7.3 (default, Apr 24 2012, 00:00:54) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>

Переменная ts - это время, возвращаемое в секундах. Затем я преобразовал его в строку, используя библиотеку datetime, создавая для нее строку, которая читается человеком.

Ответ 2

Это для текстовой формы метки времени, которая может использоваться в ваших текстовых файлах. (Название вопроса в прошлом было иным, поэтому введение в этот ответ было изменено, чтобы уточнить, как его можно интерпретировать как время. [Обновлено 2016-01-14]).

Вы можете получить .now() метку в виде строки с помощью .now() или .utcnow() datetime.datetime:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000

now отличается от utcnow как ожидалось, - иначе они работают одинаково:

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000

Вы можете явно отобразить метку времени в строке:

>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'

Или вы можете еще более четко форматировать временную метку так, как вам нравится:

>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'

Если вы хотите формат ISO, используйте метод .isoformat() объекта:

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'

Вы можете использовать их в переменных для вычислений и печати без конверсий.

>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980

Ответ 3

Основываясь на ответе #squiguy, чтобы получить истинную метку времени, я бы напечатал ее из float.

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

По крайней мере, это понятие.

Ответ 4

Ответом может быть ни то, ни другое.

  • ни то, ни другое: time.time() возвращает приблизительно количество секунд, прошедших с начала эпохи. Результат не зависит от часового пояса, поэтому это не UTC или местное время. Здесь определение POSIX для "Секунды с эпохи".

  • оба: time.time() не требует синхронизации системных часов, поэтому он отражает их значение (хотя это не имеет никакого отношения к местному часовому поясу). Разные компьютеры могут получать разные результаты одновременно. С другой стороны, если время вашего компьютера синхронизировано, то из метки времени легко получить время UTC (если мы игнорируем високосные секунды):

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)
    

Информацию о том, как получить метки времени из времени UTC в различных версиях Python, см. в разделе Как преобразовать дату в секунды с начала эпохи по UTC?

Ответ 5

В конце концов я решил:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0

Ответ 6

В конкретный часовой пояс нет такой вещи, как "эпоха". Эпоха четко определена как определенный момент времени, поэтому, если вы измените часовой пояс, время тоже изменится. В частности, на этот раз Jan 1 1970 00:00:00 UTC. Поэтому time.time() возвращает количество секунд с момента.

Ответ 7

временная метка - это всегда время в utc, но когда вы вызываете datetime.datetime.fromtimestamp, она возвращает вам время в вашем местном часовом поясе, соответствующее этой временной метке, поэтому результат зависит от вашей локали.

>>> import time, datetime, arrow

>>> time.time()
1564494136.0434234

>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)

Существует хорошая библиотека arrow с другим поведением. В этом же случае он возвращает объект времени с часовым поясом UTC.

>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>