103 votes

Formatage de date local en Python

Comment obtenir datetime.datetime.now() imprimé dans la langue locale ?

>>> session.deathDate.strftime("%a, %d %b %Y")
'Ven, 12 Juin 2009'

J'aimerais obtenir le même résultat mais dans la langue locale.

119voto

Piotr Dobrogost Points 14412

Si votre application est censée prendre en charge plusieurs paramètres régionaux, obtenir le format localisé de la date/heure en changeant le paramètre régional (au moyen de locale.setlocale()) est déconseillé. Pour expliquer pourquoi c'est une mauvaise idée, consultez la réponse d'Alex Martelli à la question Utilisation de la locale Python ou équivalent dans les applications web ? (en gros, la locale est globale et affecte toute l'application, donc la modifier pourrait changer le comportement d'autres parties de l'application)

Vous pouvez le faire proprement en utilisant le package Babel comme ceci :

>>> from datetime import date, datetime, time
>>> from babel.dates import format_date, format_datetime, format_time

>>> d = date(2007, 4, 1)
>>> format_date(d, locale='en')
u'Apr 1, 2007'
>>> format_date(d, locale='de_DE')
u'01.04.2007'

Consultez la section Date et Heure dans la documentation de Babel.

103voto

mikl Points 5906

Vous pouvez simplement définir la locale comme dans cet exemple :

>>> import time
>>> print time.strftime("%a, %d %b %Y %H:%M:%S")
Dim, 23 Oct 2005 20:38:56
>>> import locale
>>> locale.setlocale(locale.LC_TIME, "sv_SE") # suédois
'sv_SE'
>>> print time.strftime("%a, %d %b %Y %H:%M:%S")
sön, 23 okt 2005 20:39:15

25voto

schlamar Points 3108

Vous devriez utiliser %x et %X pour formater la chaîne de date dans la locale correcte. Par exemple, en suédois, une date est représentée comme 2014-11-14 au lieu de 11/14/2014.

La manière correcte d'obtenir le résultat en tant qu'Unicode est la suivante :

locale.setlocale(locale.LC_ALL, lang)
format_ = datetime.datetime.today().strftime('%a, %x %X')
format_u = format_.decode(locale.getlocale()[1])

Voici le résultat dans plusieurs langues :

Bulgare пет, 14.11.2014 г. 11:21:10 ч.
Tchèque pá, 14.11.2014 11:21:10
Danois fr, 14-11-2014 11:21:10
Allemand Fr, 14.11.2014 11:21:10
Grec Παρ, 14/11/2014 11:21:10 πμ
Anglais Fri, 11/14/2014 11:21:10 AM
Espagnol vie, 14/11/2014 11:21:10
Estonien R, 14.11.2014 11:21:10
Finlandais pe, 14.11.2014 11:21:10
Français ven., 14/11/2014 11:21:10
Croate pet, 14.11.2014. 11:21:10
Hongrois P, 2014.11.14. 11:21:10
Italien ven, 14/11/2014 11:21:10
Lituanien Pn, 2014.11.14 11:21:10
Letton pk, 2014.11.14. 11:21:10
Néerlandais vr, 14-11-2014 11:21:10
Norvégien fr, 14.11.2014 11:21:10
Polonais Pt, 2014-11-14 11:21:10
Portugais sex, 14/11/2014 11:21:10
Roumain V, 14.11.2014 11:21:10
Russe Пт, 14.11.2014 11:21:10
Slovaque pi, 14. 11. 2014 11:21:10
Slovène pet, 14.11.2014 11:21:10
Suédois fr, 2014-11-14 11:21:10
Turc Cum, 14.11.2014 11:21:10
Chinois 周五, 2014/11/14 11:21:10

11voto

Havok Points 1502

Une autre option est :

>>> import locale
>>> import datetime
>>> locale.setlocale(locale.LC_TIME,'')
'es_CR.UTF-8'
>>> date_format = locale.nl_langinfo(locale.D_FMT)
>>> date_format
'%d/%m/%Y'
>>> today = datetime.date.today()
>>> today
datetime.date(2012, 4, 23)
>>> today.strftime(date_format)
'23/04/2012'

9voto

dEll Points 100

Solution for russian language and cross platform

import sys
import locale
import datetime

if sys.platform == 'win32':
    locale.setlocale(locale.LC_ALL, 'rus_rus')
else:
    locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

print(datetime.date.today().strftime("%B %Y"))

Ноябрь 2017

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X