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


175

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

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


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



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


Ваш код очень специфично переводит время в целое число, поэтому я не понимаю, почему выводимый текст является десятичным числом?
Уэстон

ты мой плохой, я добавила 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()

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 на всех платформах или сообщают только о целых секундах. Если вам нужно полное разрешение, это работает с точностью до микросекунды.


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'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.