Подтвердить что ты не робот

Определить время начала и окончания текущего дня (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, когда это будет завершено, потому что это упростит мои операции с базой данных (<, > , == и т.д.).

4b9b3361

Ответ 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

достаточно близко для большинства людей