Usando a data/hora padrão da biblioteca Python, pode criar um objecto de data/hora a partir de uma cadeia de datas e obter o nome do dia da semana ou mês a partir dela como uma cadeia. Contudo, a língua dessas cordas depende do local (país ou região) do ambiente.
Aqui estão duas maneiras de obter o nome do dia da semana ou do mês a partir de uma data como um fio em qualquer língua.
- Alterar o locale com o módulo locale
- Definir uma nova função
Para mais informações sobre a utilização básica do módulo datetime e os métodos strptime() e strftime() para conversão entre data e hora (data, hora) e strings, consultar os artigos seguintes.
- Artigos relacionados:Conversão de datas e horas de e para as cordas com a data/hora de Python(
strftime
,strptime
)
Mudança de locale com módulo locale
A biblioteca padrão Python fornece um módulo de locale para controlar as configurações do locale.
Depende do ambiente, mas no ambiente de exemplo, utilizando o seguinte código de formatação no método strftime(), os nomes dos dias da semana e dos meses podem ser obtidos em notação inglesa.%A
, %a
, %B
, %b
O exemplo seguinte utiliza um objecto de data e hora para representar data e hora (data e hora), mas o mesmo se aplica a um objecto de data que só tem informação de data.
import datetime
import locale
dt = datetime.datetime(2018, 1, 1)
print(dt)
# 2018-01-01 00:00:00
print(dt.strftime('%A, %a, %B, %b'))
# Monday, Mon, January, Jan
LC_TIME, o locale category setting for time formatting, é verificado com locale.getlocale(), e está definido para None. Este resultado depende do ambiente.
print(locale.getlocale(locale.LC_TIME))
# (None, None)
LC_TIME para japonês (UTF-8) ja_JP.UTF-8 em locale.setlocale() para obter os nomes do dia e do mês em japonês. locale.LC_ALL pode ser usado para definir todas as categorias de locale, mas note que isto afectará, por exemplo LC_MONETARY, por exemplo.
Note-se que estas alterações só são efectivas neste código. Isto não significa que as variáveis de ambiente do sistema serão reescritas.
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
print(locale.getlocale(locale.LC_TIME))
# ('ja_JP', 'UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# 月曜日, 月, 1月, 1
Também pode alterar as definições do locale para utilizar notações noutras línguas, tais como inglês ou alemão.
locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# Monday, Mon, January, Jan
locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# Montag, Mo, Januar, Jan
Se quiser obter o dia da semana para uma determinada data a partir de uma cadeia de datas em qualquer língua, pode fazê-lo seguindo os passos abaixo.
- LC_TIME para o valor da definição da língua desejada (por exemplo ja_JP.UTF-8) em locale.setlocale()
- Conversão de uma cadeia de caracteres para um objecto de data/hora com strptime()
- Chamar strftime() nesse objecto de data/hora com o seguinte código de formatação:
%A
,%a
,%B
,%b
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
s = '2018-01-01'
s_dow = datetime.datetime.strptime(s, '%Y-%m-%d').strftime('%A')
print(s_dow)
# 月曜日
Definir uma nova função
Isto pode ser conseguido através da definição de uma nova função.
O método do dia da semana() do objecto datetime dá um valor inteiro de 0 para segunda-feira e 6 para domingo.
import datetime
dt = datetime.datetime(2018, 1, 1)
print(dt)
# 2018-01-01 00:00:00
print(dt.weekday())
# 0
print(type(dt.weekday()))
# <class 'int'>
Existe um método semelhante, isoweekday(), que retorna um valor inteiro de 1 para segunda-feira e 7 para domingo. Note-se que existe uma diferença subtil.
print(dt.isoweekday())
# 1
print(type(dt.isoweekday()))
# <class 'int'>
Se definirmos uma lista de nomes dos dias da semana para cada cadeia linguística e os recuperarmos utilizando os valores inteiros obtidos pelo método do dia da semana(), podemos alcançar o nosso objectivo.