Форум сайта python.su
0
Добрый день.
Такой вопрос.
функция time.time(), в документации написано что она возвращает временную отметку с начала эпохи по UTC. Почему она возвращает моё местное время, а не время по Гринвичу? 10 раз проверил, время по Гринвичу должно быть (time.time() - 14400)
второй вопрос: как объект datetime.datetime.now() перевести в секунда с начала эпохи?
третий вопрос: метод экземпляра объекта datetime - d.utctimetuple() - в доке говорится что возвращает объект time.struct_time содержащий дату и время приведенную к Гринвичскому времени. Проверил, вернуло локальное время, тоже самое что содержалось в самом объекте datetime.datetime.now()
Офлайн
13
Таймзона какая на машине стоит? Похоже, что 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'
Офлайн
13
memba
как объект datetime.datetime.now() перевести в секунда с начала эпохи?
In [2]: (calendar.timegm(datetime.datetime.now().timetuple()) - time.mktime(datetime.datetime.now().timetuple()))/(3600)
Out[2h]: 3.0
Офлайн
0
Тайм зона Москва (летнее время) тоесть + 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.strftime("%Y %b %d %H %M", datetime.datetime.now().utctimetuple())
'2011 Jul 05 21 42'Офлайн
13
Давайте по порядку. По вашей версии time.time() отдает не то, что написано в документации.
Как вы это проверяли непонятно.
Проверять с помощью функций из этого же модуля смысла, по-видимому нет. Обратимся к внешнему источнику и сравним:
In [2]: float(commands.getoutput("date +%s")) - time.time()
Out[2]: -0.44993710517883301NAMEЕсли оба подхода дают одинаковый результат, то они либо оба верны, либо оба неверны. У меня нет пока причин сомневаться в том, что они верны, кроме ваших слов. Поэтому я пока считаю, что вы неправы. Теперь показывайте как вы пришли к вашему выводу.
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
…
Офлайн
0
Я посмотрел так:
>>> 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'>>> 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)
Офлайн
13
Самый убедительный способ подсчета - руками. Если уж не доверять, то никому :)
Нас интересуют только часы, поэтому посчитать легко. Просто посчитаем количество целых дней, переведем их в секунды и вычтем из time.time(). Остаток переведем в часы:
In [2]: int((time.time() - int(time.time()/60./60./24.)*60*60*24)/60./60.)
Out[2]: 19
Офлайн
0
Ручной подсчёт это достаточно убедительно. Но тогда я вообще теперь не понимаю как Питон работает с датами.
>>> 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
Офлайн
0
Всё я разобрался. Спасибо
Я жил просто в неведении. Во всех языках Unix timestamp идёт по Гринвичу. А функции формирования даты его приводят сами к локальному. Что для меня было не очевидно.
Офлайн
13
membaПотому что time.mktime - функция, обратная time.localtime, как и написано в документации.
Если datetime.datetime.now().timetuple() это моё время, то тогда почему time.mktime возвращает отметку по Гринвичу.
In [2]: time.localtime(time.mktime(time.localtime())) == time.localtime(time.time())
Out[2]: True
Офлайн