Форум сайта python.su
Собственно, вот статья: http://asvetlov.blogspot.com/2011/02/date-and-time.html
Ругайте, если где ошибся
Офлайн
>>> from datetime import *
>>> dt = datetime.now()
Отредактировано (Март 1, 2011 23:12:06)
Офлайн
Статья правильная
Тоже хотелось бы услышать про
poltergeist, если таковой имеется конечно
горький опыт на производстве
Офлайн
poltergeist, вы рекомендуете на всех серверах принудительно ставить UTC? Не думаю, что это практично.
Формально UTC - не GMT. А на деле тонкостями астрономии не заморачиваются. В компьютерном деле используют GMT и UTC как синонимы.
Зачастую требуется ссылаться именно на локальное время, установленное на компьютере клиента - другого ведь нет :) Сервер далеко, каждый раз спрашивать у него время в UTC - попахивает маразмом.
Приходилось как-то при старте клиентской программы проверять правильность синхронизации времени (нужно было чтобы оно отличалось от серверного не больше чем на 30 сек) - или отказываться работать. Это довольно медленная процедура, кстати. Таким образом можно защитится от кривых рук пользователя.
poltergeist, вот вы призываете использовать относительное время, считая что оно было в UTC. При этом datetime.now() даст локальное - да и вообще слишком много способов ошибится. Можно довольно нескоро увидеть, что времена-то не совпадают!
Абсолютные времена этой проблемы лишены, а потому - безопасны. В них всегда время прописано однозначно, будь то зона UTC или EET/EEST. Просто убираем возможность наступить на грабли. Программисты - они не всегда внимательные и разбирающиеся, особенно в большом проекте. Так что строгость - не лишняя.
Опыт на производстве - да сколько угодно!
Нью-Йоркская фирма, клиенты исключительно с восточного побережья. Счастливо жили пару лет с локальным временем - пока не появился клиент из Чикаго, кажется. Ну невозможно было этомим парням из Иллинойса показывать локальные времена - так и жили все в Нью-Йоркском часовом поясе.
Другой случай, другая работа. Было строгое предупреждение - использовать только относительное время в UTC. Совсем как вы предлагаете.
В отдельной подсистеме программист по глупости и недосмотру забыл про utcnow, использовал только now. И все отлично работало, потому что в интерфейсе отображались только временные разницы. Ну, там, “5 минут назад” или “через полчаса”. Беда была в том, что в базу писались логи. В относительном локальном времени. И когда для выяснения одного инцидента пришлось в эти логи смотреть - там была каша.
zheromo
Про базу данных - вот не надо! Посмотрите еще раз, там абсолютные времена или относительные? А ваша библиотека для работы с БД какие возвращает?
Я настаиваю на повсеместном использовании абсолютных имен по той же причине, по которой призываю применять юникод.
Да, файлы и сокеты работают с байтами. Да, я могу написать программу, которой этот юникод никогда в жизни не понадобится - и без него все работает.
И я прекрасно разбираюсь в кодировках.
Но если я работаю с байтами - каждый раз приходится задумываться, какая кодировка имелась в виду? При том что явно она к строке байт не прилагается.
Если у меня юникодные строки - я работаю с ними без опасений. Вспоминаю о кодировке только тогда, когда эту строку нужно создать (получить каким-либо вводом) или наоборот выпихнуть наружу. Использование юникода гораздо безопасней.
Офлайн
Андрей СветловВ общем, получается вот что, за меня уже подумали - и даже если захотеть, ошибиться не получится
А ваша библиотека для работы с БД какие возвращает?
dn, du = datetime.now(), datetime.utcnow()
print dn
print du
print dn == du
2011-03-02 21:06:44.625000
2011-03-02 21:06:44.625000
True
Андрей СветловВремена все относительные и считается что кроме UTC у нас ничего нет (т.е. все даты даны в UTC)
Посмотрите еще раз, там абсолютные времена или относительные?
Отредактировано (Март 2, 2011 23:19:48)
Офлайн
zheromo, вы случайно не в Лондоне живете?
На моем ноуте, с которого вам пишу:
>>> from datetime import datetime
>>> dl = datetime.now()
>>> du = datetime.utcnow()
>>> dl == du
False
>>> dl
datetime.datetime(2011, 3, 2, 23, 24, 50, 923726)
>>> du
datetime.datetime(2011, 3, 2, 21, 24, 59, 994903)
>>> import time
>>> time.tzname
('EET', 'EEST')
>>> time.timezone
-7200
Офлайн
Андрей СветловВ том то и дело что был изрядно удивлен этим фактом
zheromo, вы случайно не в Лондоне живете?
zheromoВ консоли выдает вполне ожидаемый результат
библиотека, так сказать, уже импортирована
>>> from datetime import datetime
>>> dl = datetime.now()
>>> du = datetime.utcnow()
>>> dl == du
False
>>> dl
datetime.datetime(2011, 3, 3, 4, 33, 16, 593000)
>>> du
datetime.datetime(2011, 3, 2, 22, 33, 24, 625000)
Офлайн
Андрей СветловСогласен, но код не мой, я просто разместил объяву :)
Это очень удобные для разработчика правила, но люди их не приветствуют.
import time
print time.tzname
('UTC', '')
Отредактировано (Март 3, 2011 00:41:31)
Офлайн
О какой “импортированной библиотеке” идет речь?
Офлайн
Андрей СветловНу это фигурально выражаясь - библиотека - appengine
О какой “импортированной библиотеке” идет речь?
Офлайн