Преобразование даты-времени Python в rfc 2822

Если вы предпочитаете bash regex, попробуйте следующее:

declare -A name
regex="<remote-name>([^<]+)</remote-name>"

while read -r line; do
    if [[ $line =~ $regex ]]; then
        name["${BASH_REMATCH[1]}"]=1
    fi
done < "test.xml"

for i in "${!name[@]}"; do
    echo "$i"
done
28
задан Ivan Chaer 25 March 2017 в 17:27
поделиться

3 ответа

Вот рабочий код, разбитый на простые части для ясности:

>>> import datetime
>>> import time
>>> from email import utils
>>> nowdt = datetime.datetime.now()
>>> nowtuple = nowdt.timetuple()
>>> nowtimestamp = time.mktime(nowtuple)
>>> utils.formatdate(nowtimestamp)
'Tue, 10 Aug 2010 20:43:53 -0000'

Объяснение: email.utils.formatdate хочет временную метку, то есть число с плавающей точкой с секундами (и их долей) с начала эпохи. Экземпляр datetime не предоставляет вам метку времени напрямую, но он может предоставить вам временную кортеж с помощью метода timetuple и time.mktime , конечно, может затем сделать отметку времени из такого кортежа.

38
ответ дан 28 November 2019 в 02:43
поделиться

Python 3.3, в дополнение к методам, упомянутым другими комментаторами, также добавил метод format_datetime, который намного чище:

>>> import datetime
>>> import email.utils
>>> dt = datetime.datetime.now()
>>> email.utils.format_datetime(dt)
'Thu, 09 Mar 2017 10:50:00 -0000'
8
ответ дан 28 November 2019 в 02:43
поделиться

Если вам действительно нужно текущее время, просто вызовите formatdate без аргументов:

>>> from email.Utils import formatdate
>>> formatdate()
'Tue, 10 Aug 2010 20:40:23 -0000'

Но если вы должны передать ему аргумент, вам нужен вывод time.time (количество секунд с 01.01.1970):

>>> import time
>>> formatdate(time.time())
'Tue, 10 Aug 2010 20:41:43 -0000'

FWIW, datetime.datetime.now () возвращает объект datetime , а это не то, что formatdate ожидает.

Отредактировано для добавления: если у вас уже есть объект datetime, вы можете отформатировать его соответствующим образом для formatdate:

>>> import datetime
>>> dt = datetime.datetime.now()
>>> formatdate(float(dt.strftime('%s')))
'Tue, 10 Aug 2010 20:46:16 -0000'

Отредактировано: Алекс Мартелли отметил, что строка формата '% s' для strftime может не переноситься между платформами. Возможной альтернативой может быть, как он сам предположил,

>>> formatdate(time.mktime(dt.timetuple()))
'Tue, 10 Aug 2010 20:46:16 -0000'
25
ответ дан 28 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: