Python strftime - date sans début 0?

277

Lors de l'utilisation de Python strftime, existe-t-il un moyen de supprimer le premier 0 de la date si c'est avant le 10, c'est-à-dire. il en 01est de même 1? Vous ne trouvez pas quelque %chose pour ça?

Merci!

Solihull
la source

Réponses:

568

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.

Ryan
la source
11
Ne fonctionne même pas pour moi, donne une ValueError (windows, python 2.6)
rocketmonkeys
14
Cela a fonctionné pour moi sur OS X, mais j'utilise le Python 2.7.2 de python.org.
Tim Swast
13
@moose J'ai posé une question à ce sujet :-) voici la réponse -> stackoverflow.com/questions/28894172/…
Mathias
10
Je comprends ValueError: '-' is a bad directive in format '%b %-d, %Y'. OSX, Python 2.7.
Richard
8
%#dferait la même chose sur Windows
dalle
190

Nous pouvons faire ce genre de chose avec l'avènement de la formatmé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'
mgilson
la source
2
Très agréable! Malheureusement, ne fonctionne pas seul si vous souhaitez utiliser une représentation textuelle comme celle time.strftime('%A %B %d, %Y')qui donne (maintenant, en anglais) Tuesday October 07, 2014.
Pekka Klärck
@ PekkaKlärck - Une raison pour laquelle je n'avais pas remarqué votre commentaire jusqu'à présent. Il s'avère que datetime spécifie un __format__hook très intéressant qui vous permet d'écrire des choses comme ça.
mgilson
2
Un problème est qu'il '{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.
ubomb
Bon point. Je n'utilise jamais de représentations d'horloge de 12 heures dans le code, donc je n'ai pas pensé à ce cas.
mgilson
Je suggère de consulter
Mark
37

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 strftimepour 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'
Alex Martelli
la source
@guneysus que voulez-vous dire? Il devrait en résulter «1er janvier 2000»
Utilisateur
6
@User Le code ci-dessus recherche un espace vide avant 0 qui, en cas de "01 janvier 2000" n'est pas présent.
Alagappan Ramu
@alex Veuillez supprimer cette réponse, comme vous le savez probablement, c'est loin d'être une bonne réponse.
CONvid19
29

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:

  • %eau lieu de %dremplacera le zéro devant le jour du mois par un espace

Cela fonctionne sur mon Python (sous Linux). Je ne sais pas si cela fonctionnera sur le vôtre.

newacct
la source
3
% e échoue pour moi sous Windows avec Python 2.6. Je suppose que c'est * nix spécifique. Dommage :(
rocketmonkeys
1
C'est la solution la plus propre et la plus générale --- sur un système * nix, au moins. Cela fonctionne sur OS X.
BFTM
Comme %-d ci - dessus , cela fonctionne sous OS X 10.8.5 avec Python 2.7.2, mais pas sous Windows 7 Pro 64 bits avec Python 2.7.3.
Johan
1
Cela a fonctionné pour moi sur Windows 7 SP1 avec Python 3.5.1.
Neil Billingham
1
Cela a introduit un espace supplémentaire au lieu du zéro de tête, donc si vous recherchez une correspondance exacte, ce n'est peut-être pas le cas. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 23 mai' >>> eleven = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> onze.strftime ('% b% e% H')
'11
28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'
gdw2
la source
1
Cela fonctionne le 1er janvier 2000, Alexs ne fonctionne pas.
guneysus
À quoi ça sert .replace('X0','X').replace('X','')? Faites-le .replace('X0', '')et ce sera bien.
Marco Bonelli
2
@MarcoBonelli: Essayez votre suggestion sur la chaîne "X12 / X12 / 14" et vous verrez.
gdw2
1
C'est du hack, mais c'est un hack pythonique.
Josh M.
18

assez tard pour la fête mais %-dfonctionne de mon côté.

datetime.now().strftime('%B %-d, %Y')produit quelque chose comme "5 novembre 2014"

à votre santé :)

bonbon.langes
la source
1
double de la réponse principale? stackoverflow.com/a/2073189/389812
gdw2
2
ValueError: Invalid format stringdans mon système Windows.
Deqing
10

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')    
mcqwerty
la source
Notez que si vous êtes comme moi et que vous ne construisez pas votre application dans django, vous devrez dire à django que vous n'avez pas besoin de le configurer:import django.conf django.conf.settings.configure()
Alex Pretzlav
8

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)
ptronico
la source
Fonctionne parfaitement en python 3
Saurabh
Ce devrait être la réponse acceptée. Fait ce qui est demandé, super simple et facile à retenir. En parcourant rapidement les documents, je n'ai pas pu trouver ces informations.
Lucas Lima
1
"Cela devrait être la réponse acceptée". Non, cela ne devrait pas, car cela ne fonctionne que sur Linux.
user136036
4

utilisez simplement replacecomme ceci:

(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")

il affichera:

'2017/7/21'
Mohammad Hossein Shojaeinia
la source
3

Car %dvous 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().

Nathan Viboonchan
la source
2
La question OP était pour une solution utilisant un spécificateur de format dans un appel à strftime, plutôt qu'une solution roll-your-own impliquant str ()
Dave Hooper
bonne réponse, n'écoutez pas Dave Hooper
Toskan
3

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)
Chris Chewa
la source
2

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 strftimejeter 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 datetimeobjet de nouveau style à la place, qui a des attributs comme t.yearet t.monthet 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 .

Brandon Rhodes
la source
2

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").

mmitchell
la source
1

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

OliverRadini
la source
1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
user7503128
la source
Cela remplace le zéro de tête par un espace, ce qui n'est pas ce que le PO a demandé
Dave Hooper
ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'en utilisant python 3.5
ji-ruh