Як отримати час UTC у Python?


113

Я шукаю рішення на StackExchange для рішення, але нічого не робить те, що мені потрібно. У JavaScript я використовую наступне для обчислення часу UTC з 1 січня 1970 року:

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

Який би еквівалентний код Python?



Зачекайте, ви використовуєте Python чи JavaScript?
CheetSheatOverlode

Відповіді:


179

Спробуйте цей код, який використовує datetime.utcnow () :

from datetime import datetime
datetime.utcnow()

Для ваших цілей, коли вам потрібно обчислити кількість часу, витраченого між двома датами, все, що вам потрібно, - це субстратити дати закінчення та дати початку. Результати такої субстракції є об'єктом тиммедели.

З документів python:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

А це означає, що за замовчуванням ви можете отримати будь-яке з полів, згаданих у його визначенні, - дні, секунди, мікросекунди, мілісекунди, хвилини, години, тижні. Також екземпляр timedelta має метод total_seconds (), який:

Поверніть загальну кількість секунд, що містяться в тривалості. Еквівалентно (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6, обчислене з увімкненим істинним поділом.


2
можливо неприємний сюрприз щодо datetime.utcnow () полягає в тому, що він не повертає об'єкт, відомий часовій зоні, незважаючи на ім'я. Це, на мій погляд, велика проблема, тому я віддаю перевагу своїй відповіді нижче. Див. "Об'єкти дати без часового поясу слід вважати" помилкою "у додатку." julien.danjou.info/python-and-timezones
Тім Річардсон

1
Концепція так званого наївного об'єкта дати (тобто не встановлена ​​інформація про часовий пояс) служить цілі: я хочу, щоб будильник дзвонив о 06:00 кожного дня, незалежно від того, де в світі я перебуваю. Крім того, це дозволяє створити "віртуальні годинники" в комп'ютерних іграх, які говорять: зараз це 17 вечора в моєму світі фантазій. Примушення часового поясу до об'єкта дати було б незручним, особливо з арифметикою тиммедельта.
DustByte

42

У формі, найближчій до оригіналу:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

Якщо вам потрібно знати кількість секунд від 1970-01-01, а не рідний Python datetime, використовуйте це замість цього:

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

Python має умови іменування, які суперечать тому, до чого ви могли б використовуватись у Javascript, див. PEP 8 . Також функція, яка просто повертає результат іншої функції, досить нерозумна; якщо це лише питання зробити його доступнішим, ви можете створити інше ім’я функції, просто призначивши її. Перший приклад вище можна замінити на:

utc_now = datetime.datetime.utcnow

1
Мені подобається ваша відповідь краще, ніж вище оцінена зверху. Дякую за глибину тут.
Джордан Діа-Маттсон

@ Джордан, озираючись на свою відповідь, я розумію, що я допустив стилістичну помилку, поставивши імпорт всередині функції, а не на глобальному рівні, я зараз це виправлю.
Марк Викуп

8
Можливо, вам слід розглянути можливість перенесення UtcNow () в іншу функцію. Це занадто просто. Також не використовуйте підкреслення. PEP 8 такий нудний ...
vcarel

1
Однозначно не потрібно писати функцію, щоб повернути простий
однолінійний

1
@TimRichardson Я не погоджуюся, але на той момент, коли була написана відповідь, альтернативи не було - Python не включав жодних tzinfoоб'єктів, навіть для UTC.
Марк Викуп

31

Проста, стандартна лише бібліотека для сучасного пітона. Визначає часову зону з датою, на відміну від datetime.utcnow(). datetimesбез часових поясів - це нещасні випадки, які чекають.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)

5
Згідно з документацією Python 3, це рекомендований спосіб зробити це.
roskakori

Чисто та легко! Повинно бути бажаним способом.
Одружитися35

21
import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 

10

З datetime.datetime ви вже можете експортувати до часових позначок методом strroll. На прикладі функції:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

Якщо вам потрібні мікросекунди, вам потрібно змінити експортний рядок і передати в плаваюче так: return float(now.strftime("%s.%f"))


Який сенс перетворити на рядок, а потім повернутися до числа, коли можна отримати номер безпосередньо?
Марк Викуп

Справа в тому, що ви можете змінити параметри функції і з цієї причини краще дотримуватися об'єкта datetime, не використовуючи його. time.time()Ви також можете використовувати time.mktime (now.timetuple ()) для перетворення безпосередньо до int. У будь-якому випадку, для цього простого випадку time.time()є також допустимим варіантом. Те, що мені здається дивним, збирається timedelta, щоб знайти секунди.
hectorcanto

Зауважте, що strftime("%s")платформа залежить і не працює в Windows. (Принаймні, це не для мене в Windows 10).
Джуліан Кірш

8

Часовий пояс знає нульові зовнішні залежності:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)

-4

На Python 3, використовуючи лямбда-вираз, спробуйте;

from datetime import datetime
utc_now = lambda : datetime.utcnow()

і викликати функцію нормально;

print(utc_now())

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