/ / Parse string z datą i strefą czasową do UTC datetime - python, datetime, python-3.x, datetime-format, datetimeoffset

Przetwórz ciąg z datą i strefą czasową do datetime UTC - python, datetime, python-3.x, datetime-format, datetimeoffset

Koduję skrypt Pythona 3, który otrzymuje pełnydata z przesunięciem i chcę móc porównać ją z inną datą bez przesunięcia. Głównym problemem, z którym się borykam, jest to, że Python nie lubi różnych obiektów przesuniętych datetime, ponieważ narzeka, gdy próbujesz wykonać jakąkolwiek operację z tymi:

>>> date_string
"Wed, 8 May 2013 15:33:29 +0200"
>>> new_date = datetime.strptime(date_string, "%a, %d %b %Y %H:%M:%S %z")
>>> new_date
datetime.datetime(2013, 5, 8, 15, 33, 29, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))
>>> new_date - datetime.today()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can"t subtract offset-naive and offset-aware datetimes

Jako obejście „rozebrałem” date_string na dwa ciągi, raz z datą i jedną z przesunięciem, tworząc dwa obiekty: jedną datę i jedną deltę, sumując je:

>>> date_string
"Wed, 8 May 2013 15:33:29 +0200"
>>> match = re.match(r"(.*)(s+d{4})",date_string)
>>> match.group(1)
"Wed, 8 May 2013 15:33:29"
>>> match.group(2)
" +0200"
>>> parsed_date = datetime.strptime(match.group(1), "%a, %d %b %Y %H:%M:%S")
>>> match_delta = re.match(r"s+(d{2})(d{2})",match.group(2))
>>> parsed_date_delta = timedelta(minutes=int(match_delta.group(2)),hours=int(match_delta.group(1)))
>>> parsed_date_complete = parsed_date + parsed_date_delta
>>> parsed_date_complete
datetime.datetime(2013, 5, 8, 17, 33, 29)

Dzięki temu mogę uzyskać ostatnią godzinę z poprawnym przesunięciem, więc żadne porównanie z innym normalnym obiektem datetime nie spowodowałoby błędu.

Zastanawiam się, czy istnieje łatwiejszy lub skuteczniejszy sposób osiągnięcia tego celu. Pomysł polega na otrzymaniu ciągu takiego jak ten: Wed, 8 May 2013 15:33:29 +0200 i być w stanie konwertować go w obiekcie datetime bez przesunięcia, dzięki czemu mogę pracować z czasami UTC.

EDYCJA: Aby wyjaśnić trochę więcej kwestii, new_date ma wartość przesunięcia +0200 podczas datetime.today() i datetime.utcnow() nie ma tego przesunięcia, więc próba porównania lub wykonania dowolnej operacji powoduje następujący błąd w Pythonie TypeError: can"t subtract offset-naive and offset-aware datetimes.

Jeśli data jest Wed, 8 May 2013 15:33:29 +0200, czego chcę to sposób obliczenia daty w ten sposób: Wed, 8 May 2013 17:33:29, bez wartości przesunięcia, ale we właściwym czasie (przesunięcie zastosowane do czasu). W ten sposób, ponieważ nie mam przesunięcia, mogę swobodnie robić rzeczy datetime.today() i datetime.utcnow()

Odpowiedzi:

1 dla odpowiedzi № 1

Nie jestem guru Pythona, ale według te dokumenty:

metoda klasy datetime.today()

Zwraca bieżącą lokalną datę i godzinę za pomocą tzinfo Żaden. ...

Powrót nie wiąże się z żadną strefą czasowąwartość. To nie jest w UTC, przesunięcie jest po prostu nieokreślone. Dlatego ma sens, że nie pozwoliłoby na porównanie dwóch. Wynik byłby bez znaczenia.

Innymi słowy, co byś oczekiwał, że wynik tego będzie?

10 May 2013 13:00 +0200  >  10 May 2013 12:00
  • To mógłby bądź prawdą, ponieważ 13:00 jest większy wartość niż 12:00.
  • To mógłby bądź fałszywy, ponieważ może to być lokalne przesunięcie strefy czasowej -0100, więc porównujesz momenty 11:00Z > 13:00Z. Ale kto wie, czy nawet zamierzaliśmy użyć lokalnego przesunięcia, ponieważ nie określiliśmy tego.

Ponieważ mamy na myśli dokładny moment po lewej stronie, ale niejednoznaczny po prawej, operacja powoduje błąd.

Dobrze, że Python daje błąd podczas próby wykonania tego. Inne ramy, takie jak .Net, zawierają pewne założenia i zwracają wyniki, które mogą nie być tym, czego oczekiwałeś.Przeczytaj tutaj Jeśli jesteś zainteresowany.)

Więc wracając do twojego pytania, powiedziałeś:

Pomysł polega na otrzymaniu ciągu takiego jak ten: Wed, 8 maja 2013 15:33:29 +0200 i być w stanie przekonwertować go w obiekcie datetime bez przesunięcia, dzięki czemu mogę pracować z czasami UTC.

Ciąg, który masz, odzwierciedla już jego przesunięcie względem UTC. Sposób, w jaki to analizujesz, jest w porządku. Wystarczy porównać to z czymś bardziej znaczącym, takim jak datetime.now(timezone.utc)