Чи time.time()
повертається у часовий модуль Python час системи чи час у UTC?
Чи time.time()
повертається у часовий модуль Python час системи чи час у UTC?
Відповіді:
time.time()
Функція повертає кількість секунд з початку епохи, в секундах. Зауважимо, що "епоха" визначається як початок 1 січня 1970 року в UTC. Отже, епоха визначається в термінах UTC і встановлює глобальний момент у часі. Незалежно від того, де ви "секунди минулої епохи" (time.time ()) повертає те саме значення в той же момент.
Ось деякий зразок виводу, який я запустив на своєму комп’ютері, перетворивши його також на рядок.
Python 2.7.3 (default, Apr 24 2012, 00:00:54)
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>
ts
Змінна час повертається в секундах. Потім я перетворив його в рядок, використовуючи datetime
бібліотеку, зробивши її рядком, зрозумілим для людини.
import time
коли дата, як правило, дає вам часову позначку. Просто зніміть мілісекунди -str(datetime.datetime.now()).split('.')[0]
time.time()
не знаходиться в жодному часовому поясі . "секунди з епохи" - термін; це не минуло секунд з деякого моменту часу (епохи). Ви можете легко конвертувати його у ваш місцевий час (за допомогою бази даних tz) та / або часовий пояс UTC. btw, якщо ви кинете, .strftime()
результат (майже) однаковий (+/- мікросекунди).
Це для текстової форми часової позначки, яку можна використовувати у ваших текстових файлах. (Назва питання в минулому була різною, тому вступ до цієї відповіді було змінено, щоб уточнити, як це можна інтерпретувати як час. [Оновлено 2016-01-14])
Ви можете отримати позначку часу як рядок, використовуючи .now()
або .utcnow()
з datetime.datetime
:
>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000
Це now
відрізняється від utcnow
очікуваного - інакше вони працюють так само:
>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000
Ви можете надати часову позначку рядку явно:
>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'
Або ви можете бути ще більш чітким, щоб відформатувати часову позначку так, як вам подобається:
>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'
Якщо ви бажаєте формату ISO, використовуйте .isoformat()
метод об'єкта:
>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'
Ви можете використовувати їх у змінних для обчислень та друку без перетворень.
>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()
Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
datetime.datetime.utcnow()
є зло. Це створює наївний час, який не є місцевим часом. Якщо ваш місцевий час не буде UTC, це буде неправильно. Використовуйте datetime.datetime.now(datetime.timezone.utc)
замість цього. Це створює відомості про часовий пояс, що представляє поточний час.
Виходячи з відповіді #squiguy, щоб отримати справжню часову марку, я б наділив її з float.
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
Принаймні, це концепція.
type(time.time())
дає<type 'float'>
int()
поліморфний. Він повертається long
при необхідності на старі версії Python - усі цілі числа довгі в нових версіях Python.
Відповідь не могла бути ні тим, ні обом.
ні: time.time()
повертає приблизно кількість секунд, що минули після епохи. Результат не залежить від часового поясу, тому він не є ні UTC, ні місцевим часом. Ось визначення POSIX для "Секунд з епохи" .
і те й інше: time.time()
не потрібно синхронізувати годинник вашої системи, щоб він відображав її значення (хоча це не має нічого спільного з місцевим часовим поясом). Різні комп'ютери можуть отримати різні результати одночасно. З іншого боку , якщо ваш комп'ютер час буде синхронізована , то легко отримати UTC час від мітки часу (якщо ми будемо ігнорувати високосні секунди):
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(timestamp)
Про те, як отримати часові позначки від часу UTC у різних версіях Python, див. Як я можу отримати дату, перетворену на секунди з епохи відповідно до UTC?
datetime.utcfromtimestamp
хоча є 308 відгуків на відповідь datetime.fromtimestamp
:-(
time.time()
функція повертається (вона дуже коротка). Ваш коментар стосується іншого питання (ви змінили свій коментар з моменту початку відповіді на нього. На гірше). Відбітна записка; слово "правильно" слід використовувати вкрай (часові пояси складні - немає срібної кулі - розпродаж лише для конкретного випадку використання).
datetime.datetime.utcfromtimestamp(ts)
. Якщо ваш місцевий час не буде UTC, це буде НЕПРАВНО, оскільки він створює наївний час, який не є місцевим часом. Використовуйте datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)
замість цього. Це створює відомості про часовий пояс, що представляє той самий момент, що й часова мітка.
naive_dt.astimezone()
не існувало так, як неявне bytes.encode()
більше не існує в Python 3. Це правда, що в багатьох випадках вигідно працювати з UTC часом. Про модуль datetime можна сказати дуже багато речей (я відповів достатньо питань, щоб отримати золотий знак) time.time()
.
Я врешті-решт вирішив:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
повертає десятковий / плаваючий на зразок 1574115250.818733
і мілісекунди з часу епохи легко, int(time.time() * 1000)
наприклад1574115254915
У конкретному часовому поясі немає такого поняття, як "епоха". Епоха добре визначена як конкретний момент часу, тому, якщо змінити часовий пояс, зміниться і сам час. Конкретно, це час Jan 1 1970 00:00:00 UTC
. Так time.time()
повертається кількість секунд з епохи.
мітка часу завжди є унц., але коли ви телефонуєте, datetime.datetime.fromtimestamp
вона повертає вам час у вашому локальному часовому поясі, що відповідає цій часовій марці, тому результат залежить від вашої локальної точки.
>>> import time, datetime
>>> time.time()
1564494136.0434234
>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)
Існує приємна бібліотека arrow
з різною поведінкою. У тому ж випадку він повертає вам часовий об’єкт з часовим поясом UTC.
>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>