Определить время начала и окончания текущего дня (UTC → EST → UTC); питон
Я сохраняю все свои часы в UTC, и моя система настроена на UTC (хотя я в EST).
У меня есть даты, хранящиеся как:
Wed, 20 Feb 2013 03:51:39 +0000
Однако, я хотел бы выбрать информацию, основанную сегодня на EST, поэтому я пытаюсь:
-
Получить текущее время как UTC и перейти на EST
datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York'))
2013-02-19 23:17:20.560898-05:00
-
Далее я хочу получить время начала для дня EST (2013-02-19 00: 00: 00.000000-05: 00) и время окончания (2013-02-19 23: 59: 59.99999- 5:00)
-
После того, как у меня есть эти значения, я хотел бы вернуться в UTC, поэтому у меня есть высокое и низкое значение, которое я могу закрепить, чтобы исправить мой EST (мой часовой пояс).
Если это не лучший способ сделать это, или мне что-то не хватает (кажется мне слишком сложным), пожалуйста, помогите мне увидеть свет!
ТИА
Обновление за каждый ответ:
d1 = datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York'))
print d1.strftime("%m %d %Y") ; d2 = d1.replace(day=d1.day + 1) ; print d2.strftime("%m %d %Y")
Это даст мне
02 20 2013
02 21 2013
Это правильно. Теперь мне нужно генерировать полное время EST, а затем конвертировать в UTC. Этого я не могу понять. На самом деле, я, вероятно, захочу конвертировать в временную метку времени UTC, когда это будет завершено, потому что это упростит мои операции с базой данных (<, > , == и т.д.).
Ответы
Ответ 1
Первый шаг получения текущего времени как UTC и преобразования его в EST кажется немного бессмысленным. Вы используете это время для чего-либо?
Кроме того, это кажется довольно неудачным. Вы хотите получить начальный и конечный день EST в UTC, чтобы вы их создали и конвертировали в UTC. Это не так сложно.: -)
Возможно, вы захотите посмотреть на свои подпрограммы, так что вы можете использовать начало сегодняшнего дня как меньшее значение, а начало завтрашнего дня - как более высокое, так что вам не нужно иметь дело с этим 23:59: 59,9999 раз.
Update:
Из моего первоначального понимания вашего вопроса, это то, что вы хотите сделать:
Сначала вы хотите получить текущую дату, как в UTC (так что в 11 вечера EST 12-го, вы хотите 22-го, так как это 22-й в UTC, тогда.
>>> from datetime import datetime
>>> today = datetime.utcnow().date()
>>> today
datetime.date(2013, 2, 21)
Во-вторых, вы хотите 00:00:00 того дня в UTC, как начать поиск.
>>> from dateutil import tz
>>> start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
datetime.datetime(2013, 2, 21, 0, 0, tzinfo=tzutc())
За исключением того, что вы хотите знать, что это за время в Нью-Йорке:
>>> from dateutil import tz
>>> est = tz.gettz('America/New_York')
>>> start = start.astimezone(est)
>>> start
datetime.datetime(2013, 2, 20, 19, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York'))
И вы также хотите завтра как конец:
>>> from datetime import timedelta
>>> end = start + timedelta(1)
>>> end
datetime.datetime(2013, 2, 21, 19, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York'))
Резюме:
today = datetime.utcnow().date()
start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc()).astimezone(est)
end = start + timedelta(1)
Ответ 2
Я бы определенно дал Delorean вид, чтобы решить вашу проблему, выполнил бы несколько шагов.
Сначала вам нужно проанализировать вашу строку. Отлично используйте метод Delorean parse.
>>> from delorean import parse
>>> d = parse("Wed, 20 Feb 2013 03:51:39 +0000")
>>> d
Delorean(datetime=2013-02-20 03:51:39+00:00, timezone=UTC)
Как только у вас есть время datetime, которое вы проанализировали в объекте Delorean, вы просто конвертируете в EST
>>> d = d.shift('US/Eastern')
>>> d
Delorean(datetime=2013-02-19 22:51:39-05:00, timezone=US/Eastern)
Хотя и бессмысленно. Вы никогда не используете его ни для чего в своем вопросе, но очень просто с Delorean.
Затем вы получаете время в EST
from delorean import Delorean
>>> d1 = Delorean(timezone="US/Eastern")
>>> d1
Delorean(datetime=2013-02-21 00:35:56.405256-05:00, timezone=US/Eastern)
Теперь для шага truncation.
>>> d.truncate('day')
Delorean(datetime=2013-02-21 00:00:00-05:00, timezone=US/Eastern)
сделать простой сдвиг, как указано выше, в UTC.
Теперь получите конец дня.
d = d.next_day(1) # move to the next day
Затем переместиться на одну секунду. Что-то, что нужно библиотеке, я буду обновлять это. Просто введите datetime из примера Delorean
, запросив его с атрибутом datetime
.
d.datetime - timedelta(seconds=1)
datetime.datetime(2013, 2, 21, 23, 59, 59, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
Goodluck, но эта библиотека должна просто работать с операциями datetime:)
Ответ 3
Просто наткнулся на это, вот самый простой вариант, который я нашел:
from delorean import Delorean
today_d = Delorean()
sod_dt = today_d.start_of_day
eod_dt = today_d.end_of_day
sod_d = Delorean(sod_dt)
eod_d = Delorean(eod_dt)
sod_e = sod_d.epoch
eod_e = eod_d.epoch
для подтверждения:
In [69]: eod_e - sod_e
Out[69]: 86399.99999904633
достаточно близко для большинства людей