LINUX.ORG.RU

Python: правильно перевести строку с UTC временем в datetime

 , , ,


0

2

Доброго времени суток

Есть pytyhon 2.7 и естьстрока, в которой указано время в UTC

"2018-01-14 12:43:06"

Т.е. это эквивалентно

"2018-01-14 12:43:06 UTC"
"2018-01-14 15:43:06 MSK" # string ( т.к. UTC + 3 )
1515933786 # unixtime

Пытаюсь перевести строку в unixtime в python

>>> test=datetime.datetime.strptime( '2018-01-14 12:43:06', '%Y-%m-%d %H:%M:%S' )
>>> test.strftime( '%s' )
'1515922986'

Судя по unixtime, python считает, что исходная строка была в MSK ( UTC + 3 )

Пытаюсь его переубедить

>>> test2 = pytz.utc.localize( test )
>>> test2
datetime.datetime(2018, 1, 14, 12, 43, 6, tzinfo=<UTC>)
>>> test2.strftime( '%s' )
'1515922986'
>>> test2 = pytz.timezone('Europe/Moscow').localize( test )
>>> str( test2 )
'2018-01-14 12:43:06+03:00'
>>> test2.strftime( '%s' )
'1515922986'

>>> test3 = test.replace( tzinfo=pytz.timezone( 'UTC' ) )
>>> test3.strftime( '%s' )
'1515922986'
>>> test3 = test.replace( tzinfo=pytz.timezone( 'Europe/Moscow' ) )
>>> test3.strftime( '%s' )
'1515922986'

Массаракш. Мне не нужно отображать «test» в другой timezone. Мне нужно исправить ошибку с автоопределением timezone, которую допустил strptime. Что я делаю неправильно?

★★★★★

Последнее исправление: router (всего исправлений: 3)

Это ты еще не пробовал zip с кириллицией распаковывать встроенными батарейками. Там вообще мясо

makoven ★★★★★
()

Мозг закипел и отключился

Временно ( кого я обманываю ? ) вставил эпичный костыль

test  += datetime.timedelta( hours=3 )

Либо я чего-то фундаментального не понял, либо в питоне с таймзонами очень плохо

router ★★★★★
() автор топика
>>> datetime.datetime.strptime( '2018-01-14 12:43:06 MSK', '%Y-%m-%d %H:%M:%S %Z' ).strftime( '%s' )
'1515922986'
>>> datetime.datetime.strptime( '2018-01-14 12:43:06 UTC', '%Y-%m-%d %H:%M:%S %Z' ).strftime( '%s' )
'1515922986'

Жёваный стыд, ну это вообще как? Индусы обкурились?

router ★★★★★
() автор топика
Ответ на: комментарий от router

Индусы обкурились?

strptime не воспринимает таймзону, читай мануал

no-such-file ★★★★★
()
Ответ на: комментарий от pawnhearts

strptime не воспринимает таймзону, читай мануал

facepalm... А есть что-нибудь на замену этому инвалиду?

pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)

Спасибо. То что нужно

router ★★★★★
() автор топика
>>> from datetime import datetime
>>> utc = datetime.utcnow()
>>> local = datetime.now()
>>> utc
datetime.datetime(2018, 1, 14, 19, 42, 38, 816020)
>>> local
datetime.datetime(2018, 1, 14, 22, 42, 43, 8242)
>>> utc.timestamp()
1515948158.81602
>>> local.timestamp()
1515958963.008242
Deleted
()
Ответ на: комментарий от Deleted

Для второго:

>>> from time import mktime
>>> mktime(local.timetuple())
1515958963.0
>>> mktime(utc.timetuple())
1515948158.0

Deleted
()
Ответ на: комментарий от router

По мне так такой вариант по-проще

result = datetime.datetime.strptime('2018-01-14 12:43:06', '%Y-%m-%d %H:%M:%S').replace(tzinfo=pytz.utc)

greek_31 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.