Дата синтаксического анализа Python

У меня есть такая строка:

2019-04-03 05:10:35+03:00

Мне нужно вывести дату следующим образом:

2019-04-03 08:10:35

Мой код:

print(datetime.strptime(str("2019-04-03 05:10:35+03:00"), "%Y-%m-%d %H:%M:%S%z"))

но у меня ошибка:

ValueError: time data '2019-04-03 05:10:35+03:00' does not match format '%Y-%m-%d %H:%M:%S%z'

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
208
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Проблема в том, что ваша входная строка неправильно отформатирована. %z ожидает строку формата +HHMM или -HHMM; у вас есть лишний :.

Соответственно, вы можете использовать регулярное выражение для его форматирования:

import re

source = '2019-04-03 05:10:35+03:00'
formatted = re.sub(r'([+-])(\d\d):(\d\d)', r'\1\2\3', source)

print(datetime.strptime(formatted, "%Y-%m-%d %H:%M:%S%z").astimezone(timezone.utc).strftime("%Y-%m-%d %H:%M:%S"))

Выход:

2019-04-03 02:10:35

Вывод неверный.

DirtyBit 04.04.2019 12:27

Спасибо за ответ! Как я могу вывести вместо 2019-04-03 05:10:35+03:00 дату вот так 2019-04-03 08:10:35 (плюс-минус часы)

nesalexy 04.04.2019 12:31

@nesalexy Чтобы уточнить, ваш ожидаемый результат 08:10:35 или 02:10:35? (поскольку +03:00 обычно подразумевает, что данное время равно предстоящий UTC)

gmds 04.04.2019 12:31

Вывод по-прежнему неверный.

DirtyBit 04.04.2019 12:33

@DirtyBit Возможно, я неправильно понял вопрос, тогда ...

gmds 04.04.2019 12:36

@gmds, честно говоря, если мы возьмем такую ​​дату 2019-04-03 05:10:35+03:00 я думал, что нам нужно +3 часа. Например, если наше свидание такое 2019-04-03 05:10:35-03:00 я думал, что нам нужно -3 часа

nesalexy 04.04.2019 12:37

@nesalexy Если вы скажете, что сейчас время 22:00 UTC + 8, единственный другой обычный способ представить его будет в UTC, что будет 14:00. Другими словами, +03:00 после времени обычно означает часовой пояс по отношению к UTC. То, что вы вместо этого интерпретируете его как смещение хранится в том же фрагменте данных, не является неправильным, но это немного необычно, поэтому было бы хорошо получить некоторую ясность в отношении того, каков ваш фактический вариант использования.

gmds 04.04.2019 12:39

Использование datetime и split() для манипуляции str:

Предположим, что это + часов:

from datetime import datetime, timedelta

dt_1 = "2019-04-03 05:10:35+03:00"
date_ = dt_1.split("+")[0]
time_ = date_.split(" ")[1]
to_add = dt_1.split("+")[1]

d = datetime.strptime(date_, "%Y-%m-%d %H:%M:%S")
t = datetime.strptime(time_, "%H:%M:%S")
d += timedelta(hours=int(to_add.split(":")[0]), minutes=int(to_add.split(":")[1]))

print(d)

ВЫХОД:

2019-04-03 08:10:35

Это будет работать

from datetime import datetime

your_date = datetime.strptime("2019-04-03 05:10:35+03:00", "%Y-%m-%d %H:%M:%S%z")

print(your_date.strftime("%Y-%m-%d %H:%M:%S"))

Обновлено:

У вас есть «+03:00», если вы считаете часовой пояс, если вы хотите добавить это к своему результату, сделайте это следующим образом:

from datetime import datetime
your_date = datetime.strptime("2019-04-03 05:10:35+03:00", "%Y-%m-%d%H:%M:%S%z")
print((your_date + timedelta(0, your_date.tzinfo.utcoffset(your_date).seconds)).strftime("%Y-%m-%d %H:%M:%S"))

Нет, неправильный вывод.

DirtyBit 04.04.2019 12:45

Отредактировал ответ, теперь у него есть обе вещи

Milenko Jevremovic 04.04.2019 13:54

Другие вопросы по теме