Python dateformat与Portugese格式的区域设置不匹配

时间:2017-09-08 20:44:52

标签: python datetime locale

我正在尝试将葡萄牙语日期解析为日期时间。以下是我正在尝试的内容:

import locale
from datetime import datetime
locale.setlocale(locale.LC_ALL, 'pt_PT.iso88591')
date_format = '%A, %d %B %Y, %H:%M'
date_str = 'sexta-feira, 8 de setembro de 2017, 20:08'
datetime.strptime(date_str, date_format)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/_strptime.py", line 332, in _strptime
    (data_string, format))
ValueError: time data 'sexta-feira, 8 de setembro de 2017, 20:08' does not 
  match format '%A, %d %B %Y, %H:%M'

还尝试在date_str下面但仍然得到相同的错误:

date_str = 'sexta-feira, 8 setembro 2017, 20:08'

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

POSIX日期和时间格式对不同日期格式的支持有限。我建议你看一下PyICU:

from datetime import datetime
from icu import Locale, DateFormat, ICUtzinfo, TimeZone
locale = Locale('pt_PT')
tz = ICUtzinfo.getInstance('Portugal')
now = datetime.now(tz)
df = DateFormat.createDateTimeInstance(DateFormat.kFull, DateFormat.kFull, locale)
s = df.format(now)
print s
now2 = df.parse(s)
print now2
s2 = df.format(now2)
print s2

输出:

sexta-feira, 8 de setembro de 2017 às 23:26:20 Hora de verão da Europa Central
1504905980.0
sexta-feira, 8 de setembro de 2017 às 23:26:20 Hora de verão da Europa Central
  

我正在抓取一个网站,所以我需要将日期字符串(sexta-feira,8 de setembro de 2017,20:08)转换为datetime,以便将其保存到数据库中。我怎么用PyICU呢?

这需要自定义CLDR模式:

df = SimpleDateFormat("EEEE, d 'de' MMMM 'de' yyy, HH:mm", locale)
print df.parse('sexta-feira, 8 de setembro de 2017, 20:08')

答案 1 :(得分:0)

您可以使用strftime方法轻松测试反向转换。对于您的示例,它看起来像这样(很明显,为什么strptime不起作用):

In [1]: import locale

In [2]: from datetime import datetime

In [3]: locale.setlocale(locale.LC_ALL, 'pt_PT.ISO-8859-1')
Out[3]: 'pt_PT.ISO-8859-1'

In [4]: date_format = '%A, %d %B %Y, %H:%M'

In [5]: datetime.now().strftime(date_format)
Out[5]: 'S\xe1bado, 09 Setembro 2017, 00:02'