6

Как перевести строку даты и времени в формате ISO 8601 в объект datetime Python?

13

У меня есть строка даты и времени в формате "2009-05-28T16:15:00" (это, насколько я понимаю, формат ISO 8601). Один из решения, которое кажется не очень элегантным, — это разобрать строку, используя функцию time.strptime, а затем передать первые шесть элементов кортежа в конструктор datetime, как показано ниже:

datetime.datetime(*time.strptime("2007-03-04T21:08:12", "%Y-%m-%dT%H:%M:%S")[:6])

Мне не удалось найти более "чистый" способ сделать это. Есть ли более удобное решение?

3 ответ(ов)

0

Обратите внимание на информацию о временных зонах, так как вы можете столкнуться с проблемами, сравнивая даты и время без информации о временной зоне с теми, которые её содержат.

Лучше всего всегда делать временные метки с учетом временной зоны (даже если это будет только UTC), если вы действительно не уверены, зачем может понадобиться работать без неё.

Вот пример кода на Python:

#-----------------------------------------------
import datetime
import pytz
import dateutil.parser
#-----------------------------------------------

utc = pytz.utc
BERLIN = pytz.timezone('Europe/Berlin')
#-----------------------------------------------

def to_iso8601(when=None, tz=BERLIN):
  if not when:
    when = datetime.datetime.now(tz)
  if not when.tzinfo:
    when = tz.localize(when)
  _when = when.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
  return _when[:-8] + _when[-5:] # Удалить микросекунды
#-----------------------------------------------

def from_iso8601(when=None, tz=BERLIN):
  _when = dateutil.parser.parse(when)
  if not _when.tzinfo:
    _when = tz.localize(_when)
  return _when
#-----------------------------------------------

Этот код помогает гарантировать, что все даты и время, с которыми вы работаете, имеют соответствующую информацию о временной зоне, что защитит вас от возможных ошибок при сравнении или манипуляциях с ними.

0

Ваш код выглядит почти правильно, однако в нем есть некоторые моменты, которые можно улучшить для большей читабельности и корректности.

Во-первых, давайте рассмотрим функцию convert_enddate_to_seconds, которая находит количество секунд с начала эпохи (epoch time) на основе строки времени в формате ISO 8601. Код также учитывает миллисекунды и временные зоны.

Вот пример использования функции:

import datetime
import time

def convert_enddate_to_seconds(ts):
    """Принимает строку формата ISO 8601 и преобразует в эпоху времени."""
    # Убираем информацию о временной зоне и преобразуем часть даты и времени
    dt = datetime.datetime.strptime(ts[:-7], '%Y-%m-%dT%H:%M:%S.%f') + \
         datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:])) * int(ts[-6:-5] + '1')
    
    # Преобразуем в секунды
    seconds = time.mktime(dt.timetuple()) + dt.microsecond / 1000000.0
    return seconds

# Пример использования
ts = '2012-09-30T15:31:50.262-08:00'
seconds = convert_enddate_to_seconds(ts)
print(seconds)  # Вывод: 1348990310.262

Основные моменты:

  1. Функция принимает строку ts формата ISO 8601.
  2. Она использует strptime() для преобразования строки в объект datetime, игнорируя информацию о временной зоне при первом преобразовании.
  3. Затем добавляет соответствующее смещение времени (часа и минуты) в зависимости от временной зоны.
  4. Для получения времени в секундах от эпохи используется функция time.mktime(), которая требует преобразования datetime в timetuple.
  5. Последний шаг — добавление миллисекунд.

Не забудьте протестировать функцию с разными временными строками, чтобы убедиться, что она работает корректно!

0

Для преобразования времени из формата Epoch в формат ISO и наоборот в Python, вы можете использовать следующий код:

Преобразование Epoch в ISO время:

isoTime = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(epochTime))

Этот код использует функцию time.strftime, чтобы отформатировать время в виде строки ISO. Входным параметром является epochTime, который представляет собой время в формате Epoch, а time.gmtime() преобразует его в структурированное представление времени (UTC).

Преобразование ISO времени в Epoch:

epochTime = time.mktime(time.strptime(isoTime, '%Y-%m-%dT%H:%M:%SZ'))

Здесь используется time.strptime для преобразования строки в формате ISO обратно в структурированное представление времени, после чего time.mktime конвертирует его в Epoch. Входным параметром для strptime является строка isoTime, содержащая время в формате ISO.

Надеюсь, это поможет вам в ваших задачах!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь