2013-02-20 11 views
13

Przechowuję wszystkie moje czasy w UTC i mój system jest ustawiony na UTC (chociaż jestem w EST).Określa czas rozpoczęcia i zakończenia bieżącego dnia (UTC -> EST -> UTC); Python

mam termin zapisane jako:

Wed, 20 Feb 2013 03:51:39 +0000 

Jednak chciałbym, aby wybrać informacje oparte off dzisiaj do EST, więc jestem próby:

  • Pobiera aktualny czas jako UTC i zmieni się EST

    datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York')) 
    2013-02-19 23:17:20.560898-05:00 
    
  • Dalej chcę uzyskać czas rozpoczęcia dnia EST (2013 -02-19 00: 00: 00.000000-05: 00) i czas zakończenia (2013-02-19 23: 59: 59.99999-05: 00)

  • Gdy już mam te wartości, chciałbym Konwersja z powrotem na UTC, więc mam wysoką i niską wartość, którą mogę zablokować, ponieważ jest to poprawna moja EST (moja strefa czasowa).

Jeśli nie jest to najlepszy sposób, aby to zrobić, albo ja czegoś brakuje (wydaje się zbyt skomplikowane do mnie) proszę mi pomóc ujrzeć światło!

TIA

Aktualizacja za odpowiedź:

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") 

To da mi

02 20 2013 
02 21 2013 

Która jest poprawna. Teraz muszę wygenerować pełny czas EST, a następnie przejść na UTC. Tego nie mogę rozgryźć. Właściwie, prawdopodobnie chcę przekonwertować na sygnaturę czasową UTC epoki, gdy będzie to kompletne, ponieważ spowoduje to, że operacje na mojej bazie danych będą dość łatwe (<,>, ==, itp.).

+0

Nie rozumiem, co próbujesz teraz zrobić. Myślałem, że chcesz czas EST w tym przypadku 02/20/2013 00:00 UTC. Cały twój kod w tej chwili działa w bardzo złożony sposób, a otrzymasz dzisiejszą datę (i jutro) ... –

+0

(W EST, rozruch, nie UTC) –

+0

Nie zamieniaj dnia. To załamie się pod koniec każdego miesiąca. Użyj timedelta, jak na moją odpowiedź. Przestań też próbować robić wszystko w jednym wierszu. Nie powinieneś używać "większości" z mojej odpowiedzi, powinieneś używać jej * all *, tak jak jest. Powyższy kod jest bardzo trudny do odczytania. I wreszcie, czy nie używasz * czasu *?Drukujesz tylko daty. Jeśli nie chcesz czasu, większość z nich jest całkowicie bezsensowna. Daty nie mają stref czasowych, na początek. –

Odpowiedz

18

Pierwszy etap uzyskiwania aktualnego czasu jako UTC i konwertowania go na EST wydaje się nieco bezużyteczny. Czy używasz tego czasu na cokolwiek?

Poza tym wydaje się raczej straighforward. Chcesz uzyskać początek i koniec dnia EST w UTC, więc możesz je utworzyć i przekonwertować na UTC. To nie jest takie skomplikowane. :-)

Możesz jednak chcieć spojrzeć na swoje pasujące procedury, dzięki czemu możesz wykorzystać początek dzisiaj jako niższą wartość, a początek jutra jako wyższy, więc nie musisz sobie radzić z to 23: 59: 59,9999 czasu.

Aktualizacja:

Z mojego pierwotnego rozumienia swoje pytanie, to jest to, co chcesz zrobić:

najpierw chcesz otrzymać aktualną datę, jak to jest w UTC (tak na 11pm EST 12st, chcesz 22, jak to jest 22. w UTC wtedy.

>>> from datetime import datetime 
>>> today = datetime.utcnow().date() 
>>> today 
datetime.date(2013, 2, 21) 

drugie chcesz 00:00:00 tego dnia w UTC, jako początek dla wyszukiwania.

>>> from dateutil import tz 
>>> start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc()) 
datetime.datetime(2013, 2, 21, 0, 0, tzinfo=tzutc()) 

Tyle że chcesz wiedzieć, co to jest godzina w Nowym Jorku:

>>> 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')) 

I ty też chcesz jutro jako koniec:

>>> from datetime import timedelta 
>>> end = start + timedelta(1) 
>>> end 
datetime.datetime(2013, 2, 21, 19, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York')) 

Podsumowanie:

today = datetime.utcnow().date() 
start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc()).astimezone(est) 
end = start + timedelta(1) 
+0

Zmaganie z uzyskiwaniem to do pracy. Zaktualizowałem mój OP o to, co mam. –

+0

@ Mr-sk: Zaktualizowano. –

+0

Dzięki - wykorzystałem większość z tego. Zaktualizuję OP z odpowiedzią. –

5

Zdecydowanie dałbym Delorean wygląd, aby rozwiązać swój problem, wykonaj kilka kroków.

Najpierw musisz przeanalizować ciąg znaków. Doskonałe wykorzystanie metody 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) 

Gdy masz datetime że analizowany w obiekcie DeLorean po prostu przekonwertować do EST

>>> d = d.shift('US/Eastern') 
>>> d 
Delorean(datetime=2013-02-19 22:51:39-05:00, timezone=US/Eastern) 

Choć bezcelowe. Nigdy nie używasz go do niczego w swoim pytaniu, ale bardzo łatwo z Deloreanem.

Wtedy masz czasu teraz w EST

DeLorean z importu Delorean

>>> d1 = Delorean(timezone="US/Eastern") 
>>> d1 
Delorean(datetime=2013-02-21 00:35:56.405256-05:00, timezone=US/Eastern) 

teraz na etapie truncation.

>>> d.truncate('day') 
Delorean(datetime=2013-02-21 00:00:00-05:00, timezone=US/Eastern) 

Wykonaj proste przesunięcie jak powyżej do UTC.

Teraz koniec dnia.

d = d.next_day(1) # move to the next day 

Następnie, aby cofnąć o sekundę. Coś, czego biblioteka potrzebuje, będę to aktualizował. Po prostu pobierz datetime z przykładu Delorean, prosząc o to przy pomocy atrybutu 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, ale ta biblioteka powinna po prostu swój czynienia z operacjami DateTime :)

+0

@ Mr-sk to powinno pomóc! – myusuf3

+0

Cofnij się o sekundę? To nie koniec dnia, w tym dniu brakuje całej sekundy. Albo odjąć jedną mikrosekundę, albo porównasz ją z 'if some_datetime

0

Właśnie wpadł na to, oto najprostsza opcja znalazłem:

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 

aby potwierdzić:

In [69]: eod_e - sod_e 
Out[69]: 86399.99999904633 

wystarczająco blisko dla większości osób

Powiązane problemy