Найти - Пользователи
Полная версия: Модуль time и datetime
Начало » Python для новичков » Модуль time и datetime
1 2
memba
Добрый день.

Такой вопрос.

функция time.time(), в документации написано что она возвращает временную отметку с начала эпохи по UTC. Почему она возвращает моё местное время, а не время по Гринвичу? 10 раз проверил, время по Гринвичу должно быть (time.time() - 14400)

второй вопрос: как объект datetime.datetime.now() перевести в секунда с начала эпохи?

третий вопрос: метод экземпляра объекта datetime - d.utctimetuple() - в доке говорится что возвращает объект time.struct_time содержащий дату и время приведенную к Гринвичскому времени. Проверил, вернуло локальное время, тоже самое что содержалось в самом объекте datetime.datetime.now()
Ed
Таймзона какая на машине стоит? Похоже, что UTC.
In [1]: import time, datetime

In [2]: time.strftime("%Y %h %d %H %M", time.gmtime(time.time()))
Out[2]: '2011 Jul 05 17 15'

In [3]: time.strftime("%Y %h %d %H %M", time.localtime())
Out[3]: '2011 Jul 05 20 15'

In [4]: datetime.datetime.strftime(datetime.datetime.now(), "%Y %h %d %H %M")
Out[4]: '2011 Jul 05 20 17'

In [5]: datetime.datetime.strftime(datetime.datetime.now().utcnow(), "%Y %h %d %H %M")
Out[5]: '2011 Jul 05 17 18'
Ed
memba
как объект datetime.datetime.now() перевести в секунда с начала эпохи?
In [2]: (calendar.timegm(datetime.datetime.now().timetuple()) - time.mktime(datetime.datetime.now().timetuple()))/(3600)
Out[2h]: 3.0
memba
Тайм зона Москва (летнее время) тоесть + 4 часа или 14400 сек

Проверяем:

>>> time.strftime("%Y %b %d %H %M", time.localtime(time.time()))
'2011 Jul 05 21 35'

>>> time.strftime("%Y %b %d %H %M", time.localtime(time.time()-14400))
'2011 Jul 05 17 35'

#--------

>>> time.ctime(time.time())
'Tue Jul 05 21:35:02 2011'
Из этого я могу заметить что time.time() это время локальное, а не как говорится Гринвич. Или эти функции каким то образом приводят время к локальному автоматически. Тогда я не вижу смыла в передачи им аргумента.

с utctimetuple() тоже самое:

time.strftime("%Y %b %d %H %M", datetime.datetime.now().utctimetuple())
'2011 Jul 05 21 42'
Ed
Давайте по порядку. По вашей версии time.time() отдает не то, что написано в документации.
Как вы это проверяли непонятно.

Проверять с помощью функций из этого же модуля смысла, по-видимому нет. Обратимся к внешнему источнику и сравним:
In [2]: float(commands.getoutput("date +%s")) - time.time()
Out[2]: -0.44993710517883301
Выдержки из man date, относящиеся к данной теме:
NAME
date - print or set the system date and time

SYNOPSIS
date …

FORMAT controls the output. Interpreted sequences are:

%s seconds since 1970-01-01 00:00:00 UTC
Если оба подхода дают одинаковый результат, то они либо оба верны, либо оба неверны. У меня нет пока причин сомневаться в том, что они верны, кроме ваших слов. Поэтому я пока считаю, что вы неправы. Теперь показывайте как вы пришли к вашему выводу.
memba
Я посмотрел так:

>>> import time
>>> time.mktime(time.localtime())
1309892361.0

>>> time.time()
1309892362.421
Время ~ одно и тоже

И так ещё посмотрел
>>> time.strftime("%Y %b %d %H %M", time.localtime(time.time()))
'2011 Jul 05 23 02'

>>> time.ctime(time.time())
'Tue Jul 05 23:02:27 2011'
Моё время.

Потом пришло в голову сравнить с тем что возвращает PHPшная функция time() .. он возвращает время на машине. Результат был одинаков.

Я не очень понимаю, почему тут результат тогда разный, если я передаю конкретно временную отметку:

>>> time.gmtime(time.time())
time.struct_time(tm_year=2011, tm_mon=7, tm_mday=5, tm_hour=19, tm_min=5, tm_sec=43, tm_wday=1, tm_yday=186, tm_isdst=0)

>>> time.localtime(time.time())
time.struct_time(tm_year=2011, tm_mon=7, tm_mday=5, tm_hour=23, tm_min=5, tm_sec=43, tm_wday=1, tm_yday=186, tm_isdst=1)
Из вышеуказанного примера я вынужден считать что либо gmtime вычитает автоматом 14400 сек либо localtime прибавляет 14400 сек. Но тогда это не вяжется с первым примером где у localtime нет аргумента и он должен взять текущее время сам.
Ed
Самый убедительный способ подсчета - руками. Если уж не доверять, то никому :)
Нас интересуют только часы, поэтому посчитать легко. Просто посчитаем количество целых дней, переведем их в секунды и вычтем из time.time(). Остаток переведем в часы:
In [2]: int((time.time() - int(time.time()/60./60./24.)*60*60*24)/60./60.)
Out[2]: 19
У меня сейчас 22:18 и зона EET, на один час отличается от вашей. То есть GMT - 3. Все сходится :)
memba
Ручной подсчёт это достаточно убедительно. Но тогда я вообще теперь не понимаю как Питон работает с датами.

>>> datetime.datetime.now().timetuple()
time.struct_time(tm_year=2011, tm_mon=7, tm_mday=5, tm_hour=23, tm_min=24, tm_sec=54, tm_wday=1, tm_yday=186, tm_isdst=-1)

>>> time.mktime(datetime.datetime.now().timetuple())
1309893881.0

>>> time.time()
1309893881.468
Если datetime.datetime.now().timetuple() это моё время, то тогда почему time.mktime возвращает отметку по Гринвичу.
memba
Всё я разобрался. Спасибо

Я жил просто в неведении. Во всех языках Unix timestamp идёт по Гринвичу. А функции формирования даты его приводят сами к локальному. Что для меня было не очевидно.
Ed
memba
Если datetime.datetime.now().timetuple() это моё время, то тогда почему time.mktime возвращает отметку по Гринвичу.
Потому что time.mktime - функция, обратная time.localtime, как и написано в документации.
Вот вам доказательство:
In [2]: time.localtime(time.mktime(time.localtime())) == time.localtime(time.time())
Out[2]: True
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB