Какой самый простой способ получить текущее время по Гринвичу в формате отметки времени Unix?

175

Python предоставляет различные пакеты ( datetime, time, calendar) , как можно увидеть здесь , чтобы иметь дело со временем. Я сделал большую ошибку, используя следующее, чтобы получить текущее время по Гринвичуtime.mktime(datetime.datetime.utcnow().timetuple())

Какой простой способ получить текущее время по Гринвичу в метке времени Unix?

Cory
источник
1
Что такое ввод / вывод? datetime.utcnow()возвращает текущее время UTC как объект datetime (я предполагаю, что вы хотите UTC, когда вы говорите о «времени по Гринвичу»). time.time()возвращает метку времени Unix как число с плавающей точкой. Вот как конвертировать datetime.date/datetime.datetime, представляющее время в UTC, в метку времени POSIX .
JFS
Ваш предложенный метод неверен или просто слишком многословен? Связанный: stackoverflow.com/questions/15940280/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
Почему ваш метод был ошибкой?
skeller88

Ответы:

230

Я бы использовал time.time (), чтобы получить метку времени в секундах с начала эпохи.

import time

time.time()

Вывод:

1369550494.884832

Для стандартной реализации CPython на большинстве платформ это будет возвращать значение UTC.

Эдмонд Бернетт
источник
21
Подвох в том, что локальные часы вашей машины могут быть не в UTC.
9000
@ 9000: Правильно, хотя я всегда настаиваю на UTC в любой среде, где важно время. И он попросил самое простое решение. Обратите внимание, что с CPython на современных платформах, включая Linux, BSD, Mac OS X и Windows, все вернет UTC для time.time (). Это отражает поведение функции времени стандартной библиотеки C в этих ОС.
Эдмонд Бернетт
66
@ 9000: местный часовой пояс не имеет значения. Время Unix соответствует времени UTC (если мы игнорируем время вокруг високосных секунд). Подумайте об этом: отметка времени - это количество секунд, прошедших с начала эпохи (фиксированный момент времени): почему это будет зависеть от того, какие локальные часы использует машина часового пояса? В любой момент времени время Unix одинаково во всем мире. Некоторые (неизвестные) платформы могут использовать другую эпоху, но ее значение все равно не будет зависеть от местного часового пояса.
JFS
stackoverflow.com/questions/13890935/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
125
import time

int(time.time()) 

Вывод:

1521462189
Максимум
источник
42

Это помогает?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

Как преобразовать объект даты и времени Python UTC в метку времени UNIX

Ник Каплингер
источник
@Cairnarvon Это был просто пример. Если вам нужна текущая временная метка, вы можете просто позвонить time.time()и вообще не нуждаться в преобразовании даты и времени.
Месса
1
FWIW: Это не время UTC, это UTC, преобразованное в местное время. Чтобы получить метку времени в UTC, нужно сделать что-то еще.
Sherlock70
18

Или просто используя стандартный модуль datetime

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

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

Если вам нужна правильная метка времени Unix (в секундах), удалите* 1000

Maresh
источник
Ваш код очень специфично переводит время в целое число, поэтому я не понимаю, почему выводимый текст является десятичным числом?
Уэстон
ты мой плохой, я добавила int casting
Maresh
Это точный эквивалент momentбиблиотеки Javascript moment().utc().valueOf(). Именно то, что я искал. Спасибо
azhar22k
Предполагается, что временная метка UNIX будет равна секундам с 1970 года. Ваше решение этого не дает.
скайкинг
1
«Вы можете обрезать или умножить в зависимости от желаемого разрешения». Отбросьте часть * 1000, и вы получите секунды.
Мареш
18

python2 и python3

хорошо использовать модуль времени

import time
int(time.time())

1573708436

Вы также можете использовать модуль datetime, но когда вы используете strftime ('% s'), но strftime конвертирует время в ваше местное время!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()
Mika
источник
2
Находясь в UTC + 1, time.time()и datetime.utcnow().timestamp()ничего не дают такое же значение!
user136036
Также, хотя я ожидал, что 2-й вариант будет правильным, мне пришлось использовать datetime.now (). Timestamp (), чтобы получить правильное значение в UTC + 1100. Я ожидал, что timestamp () будет работать правильно для обоих, но, похоже, это не так
David Waterworth
Если присмотреться, то и datetime.utcnow (), и datetime.now () возвращают наивное datetime (без tzinfo), а timestamp () принимает локальное значение, когда tzinfo = null.
Дэвид Уотерворт
2

Мне нравится этот метод:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

Другие методы, опубликованные здесь, не гарантируют выдачу UTC на всех платформах или сообщают только о целых секундах. Если вам нужно полное разрешение, это работает с точностью до микросекунды.

vschmidt
источник
1
К сожалению, это не дает UTC, если вы не находитесь в часовом поясе UTC + 0000. Использование utctimetupleвместо этого делает трюк, хотя.
Скайкинг
1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

Вывод:

1544524990

источник
это не возвращает так же, как time.time()для меня.
Алвиний
1
Это, вероятно, потому что dt.utcnowвернуть datetimeбез информации о часовом поясе. Затем strftimeпредполагается, что datetimeэто местное время.
Скайкинг
1
@skyking Это в значительной степени проблема почти для всех ответов на этой странице!
Дэвид Уотерворт
1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

Выход: 1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

Выход: 1572878043

  • Здесь мы видим, что первый пример дает более точное время, чем второй.
  • Здесь я использую первый.
Чандан Шарма
источник
1

По крайней мере, в python3 это работает:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
usernamenumber
источник