Чи повертає Python time.time () мітку часу або UTC?


558

Чи time.time()повертається у часовий модуль Python час системи чи час у UTC?


87
У часових марках немає часових поясів. Вони представляють кількість секунд з епохи. Епоха - це конкретний момент часу, який не залежить від часового поясу.
jwg

2
@jwg: часто використовувані часові позначки POSIX не враховують високосні секунди, і тому вони не є "числом [минулих SI] секунд після епохи" (вони близькі).
jfs

7
Я не думаю, що це точне заперечення @JFSebastian. Перехідні секунди не є "минулими секундами з епохи". Вони являють собою зміни у часових уявленнях, записаних годинниками, які не відповідають минулим секундам.
jwg

4
@JFSebastian Вибачте за плутанину. Перехідні секунди не є "минулими секундами". Тому часові позначки, які є "числами минулих секунд", не містять і не повинні включати високосні секунди.
jwg

2
@jwg неправильно. Ви не можете стерти фізичний час. Часова мітка POSIX - це не кількість минулих SI секунд. Ось приклад: між "31 грудня 2016 року о 18:59:59 вечора" та "31 грудня 2016 року о 19:00:01 вечора" у Нью-Йорку минуло 3 секунди, але різниця у відповідних часових позначках POSIX становить лише 2 секунди ( другий стрибок не враховується).
jfs

Відповіді:


779

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бібліотеку, зробивши її рядком, зрозумілим для людини.


72
Чому ми повинні, import timeколи дата, як правило, дає вам часову позначку. Просто зніміть мілісекунди -str(datetime.datetime.now()).split('.')[0]
Хуссей

17
Епоха @Alexis Unix тут чітко визначена . Він навіть вказує на прикладі Python способи зменшення сторінки. Я не розумію вашого коментаря.
squiguy

9
@ чесно кажучи, я не пам'ятаю, що змусило це сказати. Я, мабуть, щось неправильно прочитав, і я намагався знайти, чому деякі тести ламаються, коли я переїжджав між Францією та США, щоб нарешті виявити, що це питання через DST, що робить тиждень довшим у цей період року. Вибачте за це і дякую, що вказали на це.
Олексій

5
це не "секунди в UTC". . Повернута мітка часу time.time()не знаходиться в жодному часовому поясі . "секунди з епохи" - термін; це не минуло секунд з деякого моменту часу (епохи). Ви можете легко конвертувати його у ваш місцевий час (за допомогою бази даних tz) та / або часовий пояс UTC. btw, якщо ви кинете, .strftime()результат (майже) однаковий (+/- мікросекунди).
jfs

3
щойно перевірив це, time.time () не дає часу UTC, він дає мій час в локальній зоні
sliders_alpha

301

Це для текстової форми часової позначки, яку можна використовувати у ваших текстових файлах. (Назва питання в минулому була різною, тому вступ до цієї відповіді було змінено, щоб уточнити, як це можна інтерпретувати як час. [Оновлено 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

1
Я хотів часу епохи .... не у форматі дати ... як це було видно з моєї згадки про команду time.time ()
Саранш Мохапатра

34
Без проблем. Для розміщення в текстових файлах комусь іншому може знадобитися позначка часової позначки .
pepr

1
Я ще один, перенаправлений сюди, ймовірно, через необгрунтовану кількість заявок. Питання неправильне, і прийнята відповідь вводить в оману для типової потреби: отримання людського читаного суфікса - скажімо, для файлових файлів - у найбільш використовуваному часовому поясі сервера.

Щоб надрукувати часову позначку як частину рядка, використовуйте це: Python2: import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE

datetime.datetime.utcnow()є зло. Це створює наївний час, який не є місцевим часом. Якщо ваш місцевий час не буде UTC, це буде неправильно. Використовуйте datetime.datetime.now(datetime.timezone.utc)замість цього. Це створює відомості про часовий пояс, що представляє поточний час.
Террел

139

Виходячи з відповіді #squiguy, щоб отримати справжню часову марку, я б наділив її з float.

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

Принаймні, це концепція.


1
У чому причина введення часової позначки? Який тип за замовчуванням?
Tizzee

3
@Tizzee type(time.time())дає<type 'float'>
знаменитий Гаркін

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

3
@RudiStrydom: Python сильно набраний. Не плутайте це з набором статичного типу.
jfs

1
@CheokYanCheng: int()поліморфний. Він повертається longпри необхідності на старі версії Python - усі цілі числа довгі в нових версіях Python.
jfs

30

Відповідь не могла бути ні тим, ні обом.

  • ні: time.time()повертає приблизно кількість секунд, що минули після епохи. Результат не залежить від часового поясу, тому він не є ні UTC, ні місцевим часом. Ось визначення POSIX для "Секунд з епохи" .

  • і те й інше: time.time()не потрібно синхронізувати годинник вашої системи, щоб він відображав її значення (хоча це не має нічого спільного з місцевим часовим поясом). Різні комп'ютери можуть отримати різні результати одночасно. З іншого боку , якщо ваш комп'ютер час буде синхронізована , то легко отримати UTC час від мітки часу (якщо ми будемо ігнорувати високосні секунди):

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)
    

Про те, як отримати часові позначки від часу UTC у різних версіях Python, див. Як я можу отримати дату, перетворену на секунди з епохи відповідно до UTC?


4
Це єдина відповідь, яка правильно згадується, datetime.utcfromtimestampхоча є 308 відгуків на відповідь datetime.fromtimestamp:-(

@TerrelShumway виникає питання про те, що time.time()функція повертається (вона дуже коротка). Ваш коментар стосується іншого питання (ви змінили свій коментар з моменту початку відповіді на нього. На гірше). Відбітна записка; слово "правильно" слід використовувати вкрай (часові пояси складні - немає срібної кулі - розпродаж лише для конкретного випадку використання).
jfs

Не використовуйте datetime.datetime.utcfromtimestamp(ts). Якщо ваш місцевий час не буде UTC, це буде НЕПРАВНО, оскільки він створює наївний час, який не є місцевим часом. Використовуйте datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)замість цього. Це створює відомості про часовий пояс, що представляє той самий момент, що й часова мітка.
Террел

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

@TerrelShumway Неправильно вважати, що час UTC може використовуватися лише в системах, де це місцевий час. Це правда, що деякі частини stdlib трактують наївні предмети часу як такі, що мають місцевий часовий пояс (на жаль). Я вважаю за краще, щоб naive_dt.astimezone()не існувало так, як неявне bytes.encode()більше не існує в Python 3. Це правда, що в багатьох випадках вигідно працювати з UTC часом. Про модуль datetime можна сказати дуже багато речей (я відповів достатньо питань, щоб отримати золотий знак) time.time().
jfs

4

Я врешті-решт вирішив:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0

1
Це може задовольнити ваші місцеві потреби, але це може ввести в оману людей, які очікують, що номери в цьому діапазоні будуть секунди з епохи [GMT]. time.time()повертає десятковий / плаваючий на зразок 1574115250.818733і мілісекунди з часу епохи легко, int(time.time() * 1000)наприклад1574115254915
MarkHu

3

У конкретному часовому поясі немає такого поняття, як "епоха". Епоха добре визначена як конкретний момент часу, тому, якщо змінити часовий пояс, зміниться і сам час. Конкретно, це час Jan 1 1970 00:00:00 UTC. Так time.time()повертається кількість секунд з епохи.


Хоча це правда, що UTC - це часовий стандарт, а не часовий пояс, стандартний - він поділяє той же час, що й GMT. Отже ....
Крейг Хікс

3

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