Réponses:
En fait, j'ai eu le même problème et j'ai réalisé que si vous ajoutez un trait d'union entre la %
et la lettre, vous pouvez supprimer le zéro de tête.
Par exemple %Y/%-m/%-d
.
Cela ne fonctionne que sous Unix (Linux, OS X), pas Windows (y compris Cygwin). Sous Windows, vous utiliseriez #
, par exemple %Y/%#m/%#d
.
ValueError: '-' is a bad directive in format '%b %-d, %Y'
. OSX, Python 2.7.
%#d
ferait la même chose sur Windows
Nous pouvons faire ce genre de chose avec l'avènement de la format
méthode depuis python2.6:
>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'
Bien que cela dépasse peut-être la portée de la question d'origine, pour des formats plus intéressants, vous pouvez faire des choses comme:
>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'
Et à partir de python3.6, cela peut être exprimé comme une chaîne formatée en ligne :
Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> dt = datetime.datetime.now()
>>> f'{dt:%A} {dt:%B} {dt.day}, {dt.year}'
'Monday August 29, 2016'
time.strftime('%A %B %d, %Y')
qui donne (maintenant, en anglais) Tuesday October 07, 2014
.
__format__
hook très intéressant qui vous permet d'écrire des choses comme ça.
'{dt.hour}'
utilise une horloge de 24 heures :(. L'utilisation de la deuxième option vous ramène toujours à l'utilisation '{%#I}'
sur Windows et '{%-I}'
sur Unix.
Certaines plates-formes peuvent prendre en charge la spécification de largeur et de précision entre %
et la lettre (comme «d» pour le jour du mois), selon http://docs.python.org/library/time.html - mais c'est certainement un non portable (par exemple ne fonctionne pas sur mon Mac ;-). Peut-être pouvez-vous utiliser un remplacement de chaîne (ou RE, pour un format vraiment désagréable) après strftime
pour y remédier? par exemple:
>>> y
(2009, 5, 7, 17, 17, 17, 3, 127, 1)
>>> time.strftime('%Y %m %d', y)
'2009 05 07'
>>> time.strftime('%Y %m %d', y).replace(' 0', ' ')
'2009 5 7'
Voici la documentation des modificateurs supportés par strftime()
dans la bibliothèque GNU C. (Comme les gens l'ont dit auparavant, il pourrait ne pas être portable.) Vous pourriez être intéressé par:
%e
au lieu de %d
remplacera le zéro devant le jour du mois par un espaceCela fonctionne sur mon Python (sous Linux). Je ne sais pas si cela fonctionnera sur le vôtre.
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'
.replace('X0','X').replace('X','')
? Faites-le .replace('X0', '')
et ce sera bien.
Sous Windows, ajoutez un '#', comme dans '% # m /% # d /% Y% # I:% M:% S% p'
Pour référence: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx
assez tard pour la fête mais %-d
fonctionne de mon côté.
datetime.now().strftime('%B %-d, %Y')
produit quelque chose comme "5 novembre 2014"
à votre santé :)
ValueError: Invalid format string
dans mon système Windows.
Je trouve que le filtre de formatage de la date du modèle Django est rapide et facile. Il supprime les zéros non significatifs. Si cela ne vous dérange pas d'importer le module Django, vérifiez-le.
http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
from django.template.defaultfilters import date as django_date_filter
print django_date_filter(mydate, 'P, D M j, Y')
import django.conf
django.conf.settings.configure()
Jetez un œil au -
soufflet:
>>> from datetime import datetime
>>> datetime.now().strftime('%d-%b-%Y')
>>> '08-Oct-2011'
>>> datetime.now().strftime('%-d-%b-%Y')
>>> '8-Oct-2011'
>>> today = datetime.date.today()
>>> today.strftime('%d-%b-%Y')
>>> print(today)
utilisez simplement replace
comme ceci:
(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")
il affichera:
'2017/7/21'
Car %d
vous pouvez convertir en entier en utilisant int()
alors il supprimera automatiquement le 0 en tête et deviendra entier. Vous pouvez ensuite reconvertir en chaîne à l'aide de str()
.
utiliser, par exemple, "% -d" n'est pas portable même entre différentes versions du même système d'exploitation. Une meilleure solution serait d'extraire les composants de date individuellement et de choisir entre les opérateurs de formatage spécifiques à la date et l'accès aux attributs de date pour chaque composant.
e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
Parce que Python appelle vraiment la strftime(3)
fonction de langage C sur votre plate-forme, il se peut qu'il y ait des caractères de format que vous pouvez utiliser pour contrôler le zéro de tête; essayez de man strftime
jeter un oeil. Mais, bien sûr, le résultat ne sera pas portable, comme le manuel Python vous le rappellera. :-)
J'essaierais d'utiliser un datetime
objet de nouveau style à la place, qui a des attributs comme t.year
et t.month
et t.day
, et de les soumettre au formatage normal et puissant de l' %
opérateur, qui prend en charge le contrôle des zéros non significatifs. Voir http://docs.python.org/library/datetime.html pour plus de détails. Mieux encore, utilisez l' "".format()
opérateur si votre Python l'a et soyez encore plus moderne; il dispose également de nombreuses options de format pour les nombres. Voir: http://docs.python.org/library/string.html#string-formatting .
Basé sur la méthode d'Alex, cela fonctionnera à la fois pour les cas de début de chaîne et d'après-espaces:
re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")
J'aime mieux cela que .format ou% -d parce que c'est multiplateforme et me permet de continuer à utiliser strftime (pour obtenir des choses comme "novembre" et "lundi").
Vieille question, mais% l (minuscule L) a fonctionné pour moi en strftime: cela peut ne pas fonctionner pour tout le monde, car il n'est pas répertorié dans la documentation Python que j'ai trouvée
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'
en utilisant python 3.5