Який найпростіший спосіб отримати поточний час GMT у форматі часових міток Unix?


175

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

Який простий спосіб отримати поточний час GMT в часовій марці Unix?


1
Що таке вхід / вихід? datetime.utcnow()повертає поточний час UTC як об’єкт дати (я припускаю, що ви хочете UTC, коли ви говорите про "GMT GMT"). 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 (). Це відображає поведінку функції часу стандартної бібліотеки С на цих ОС.
Едмонд Бернетт

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()і взагалі не потребувати перетворення дати.
Messa

1
FWIW: Це не час UTC, це UTC, перетворений на місцевий час. Щоб отримати позначку часу в UTC, потрібно зробити ще щось.
Шерлок70

18

Або просто за допомогою стандартного модуля datetime

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

Ви можете усікати або множити залежно від потрібної роздільної здатності. Цей приклад - виведення міліс.

Якщо ви хочете отримати правильну часову позначку Unix (у секундах), видаліть* 1000


Ви дуже конкретно вводите код у ціле число, тому я збентежений, чому вихідний текст - це десяткове число?
Вестон

Ви мені погані, я додав інший кастинг пізніше
Мареш

Це точний еквівалент momentбібліотеки Javascript moment().utc().valueOf(). Саме те, що я шукав. Дякую
azhar22k

Часові позначки UNIX повинні становити секунди з 1970 року. Це рішення не дає цього.
похитуючись

1
"Ви можете скоротити або помножити залежно від потрібної роздільної здатності" Відкиньте * 1000 частину і отримаєте секунди.
Мареш

18

python2 і python3

добре використовувати модуль часу

import time
int(time.time())

1573708436

Ви також можете використовувати модуль datetime, але коли ви використовуєте strearch ('% s'), але strroll перетворює час у ваш місцевий час!

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()нічого НЕ дають таке ж значення!
користувач136036

Крім того, хоча я очікував, що другий варіант буде правильним, мені довелося використовувати datetime.now (). Timestamp (), щоб отримати правильне значення в UTC + 1100. Я очікував, що часова мітка () спрацює правильно для будь-якого, але це, здається,
Девід Уотерворт,

Приблизившись, і datetime.utcnow (), і datetime.now () повертають наївну дату (без tzinfo), а часова марка () вважає місцевою, коли 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

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

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