Який найпростіший спосіб отримати поточний час 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.