Jak uzyskać ciąg isoformat datetime zawierający domyślną strefę czasową?

Muszę wytworzyć łańcuch czasowy pasujący do formatu iso yyyy-mm-ddThh:mm:ss.ssssss-ZO:NE. Metody klas now() i utcnow() robią prawie to, co chcę.

>>> import datetime
>>> #time adjusted for current timezone
>>> datetime.datetime.now().isoformat()
'2010-08-03T03:00:00.000000'
>>> #unadjusted UTC time
>>> datetime.datetime.utcnow().isoformat()
'2010-08-03T10:00:00.000000'
>>>
>>> #How can I do this?
>>> datetime.datetime.magic()
'2010-08-03T10:00:00.000000-07:00'
Author: deft_code, 2010-08-04

5 answers

Coś w stylu poniższego przykładu. Uwaga jestem we wschodniej Australii (UTC + 10 godzin w tej chwili).

>>> import datetime
>>> dtnow = datetime.datetime.now();dtutcnow = datetime.datetime.utcnow()
>>> dtnow
datetime.datetime(2010, 8, 4, 9, 33, 9, 890000)
>>> dtutcnow
datetime.datetime(2010, 8, 3, 23, 33, 9, 890000)
>>> delta = dtnow - dtutcnow
>>> delta
datetime.timedelta(0, 36000)
>>> hh,mm = divmod((delta.days * 24*60*60 + delta.seconds + 30) // 60, 60)
>>> hh,mm
(10, 0)
>>> "%s%+02d:%02d" % (dtnow.isoformat(), hh, mm)
'2010-08-04T09:33:09.890000+10:00'
>>>
 -5
Author: John Machin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 00:37:55

Aby uzyskać aktualny czas w UTC w Pythonie 3.2+:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2015-01-27T05:57:31.399861+00:00'

Aby uzyskać czas lokalny w Pythonie 3.3+:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).astimezone().isoformat()
'2015-01-27T06:59:17.125448+01:00'

Wyjaśnienie: datetime.now(timezone.utc) tworzy obiekt świadomy strefy czasowej datetime w czasie UTC. astimezone() następnie zmienia strefę czasową obiektu datetime na lokalną strefę czasową systemu, jeśli zostanie wywołana bez argumentów. Obiekty Timezone aware datetime następnie automatycznie wytwarzają prawidłowy format ISO.

 55
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-01 21:05:37

Musisz uświadomić swoim obiektom strefę czasową datetime. z datetime docs :

Istnieją dwa rodzaje obiektów daty i czasu: "naiwny" i "świadomy". Rozróżnienie to odnosi się do tego, czy obiekt ma jakiekolwiek pojęcie strefy czasowej, czasu letniego lub innego rodzaju algorytmicznej lub politycznej regulacji czasu. To, czy naiwny obiekt datetime reprezentuje Uniwersalny czas koordynowany (UTC), czas lokalny lub czas w innej strefie czasowej, zależy wyłącznie od programu, tak jak to od programu zależy, czy dana liczba reprezentuje metry, mile, czy masę. Naiwne obiekty datetime są łatwe do zrozumienia i pracy, kosztem ignorowania niektórych aspektów rzeczywistości.

Gdy masz obiekt aware datetime, możesz użyć isoformat () i uzyskać potrzebne dane wyjściowe.

Aby uświadomić sobie obiekty datetime, musisz podklasę tzinfo, jak w drugim przykładzie, lub prościej-użyć pakietu, który zrobi to za Ciebie, jak pytz lub python-dateutil

Używając pytz, wyglądałoby to tak:

import datetime, pytz
datetime.datetime.now(pytz.timezone('US/Central')).isoformat()

Możesz również kontrolować format wyjściowy, jeśli używasz strftime z dyrektywą formatu'%z' Jak

datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')
 32
Author: Ofri Raviv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 05:53:02

Z strzałką :

>>> import arrow
>>> arrow.now().isoformat()
'2015-04-17T06:36:49.463207-05:00'
>>> arrow.utcnow().isoformat()
'2015-04-17T11:37:17.042330+00:00'
 17
Author: Wes Turner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-17 11:45:07

Możesz to zrobić w Pythonie 2.7 + za pomocą python-dateutil (który jest domyślnie w systemie Mac):

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> datetime.now(tzlocal()).isoformat()
'2016-10-22T12:45:45.353489-03:00'

Lub ty, jeśli chcesz przekonwertować z istniejącego przechowywanego ciągu:

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> from dateutil.parser import parse
>>> parse("2016-10-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-10-21T16:33:27.696173-03:00' <-- Atlantic Daylight Time (ADT) 
>>> parse("2016-01-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-01-21T16:33:27.696173-04:00' <-- Atlantic Standard Time (AST)
 2
Author: Dmitry Shesterkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-26 14:15:02