web-dev-qa-db-fra.com

Python strftime - date sans premier 0?

Lorsque vous utilisez Python strftime, existe-t-il un moyen de supprimer le premier 0 de la date s'il se situe avant le 10, c'est-à-dire. alors 01 est 1? Vous ne trouvez pas un %thingy pour cela?

Merci!

200
Solihull

En fait, j'ai eu le même problème et je me suis rendu compte que, si vous ajoutez un trait d'union entre le % et la lettre, vous pouvez supprimer le zéro non significatif.

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.

453
Ryan

Nous pouvons faire ce genre de chose avec l'avènement de la méthode format depuis python2.6:

>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'

Peut-être au-delà de la question initiale, 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é par une chaîne formatée inline :

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'
171
mgilson

Certaines plates-formes peuvent prendre en charge la spécification de largeur et de précision entre % et la lettre (telle que "d" pour le jour du mois), selon http://docs.python.org/library/time.html - mais c’est certainement une solution non portable (par exemple, ne fonctionne pas sur mon Mac ;-). Peut-être que vous pouvez utiliser une chaîne de remplacement (ou RE, pour le format vraiment méchant) après la strftime pour remédier à cela? 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'
35
Alex Martelli
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'
26
gdw2

Ici est la documentation des modificateurs supportés par strftime() dans la bibliothèque GNU C. (Comme on l'a déjà dit, cela pourrait ne pas être portable.) Ce qui pourrait vous intéresser pourrait être:

  • %e au lieu de %d remplacera le zéro non significatif du jour du mois par un espace

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

19
newacct

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é :)

14
bonbon.langes

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

13
Chad Kennedy

Je trouve que le filtre de formatage de date de modèle Django est simple et rapide. 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')    
9
mcqwerty

Jetez un oeil à - ci-dessous:

>>> 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)
4
ptronico

utilisez simplement replace comme ceci:

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

il produira:

'2017/7/21'

Sur la base de 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 multi-plateforme et me permet de continuer à utiliser strftime (pour obtenir des choses comme "novembre" et "lundi").

2
mmitchell

Pour %d, vous pouvez convertir en entier à l'aide de int(). Le 0 initial sera automatiquement supprimé et deviendra un entier. Vous pouvez ensuite reconvertir en chaîne à l'aide de str().

2
Nathan Viboonchan

Ancienne question, mais% l (minuscule L) a fonctionné pour moi dans strftime: cela ne fonctionnera peut-être pas pour tout le monde, cependant, car cela ne figure pas dans la documentation Python que j'ai trouvée

1
OliverRadini

Étant donné que Python appelle simplement la fonction strftime(3) du langage C sur votre plate-forme, il est possible que vous utilisiez des caractères de format que vous pourriez utiliser pour contrôler le zéro non significatif; essayez man strftime et jetez un coup d'oeil. Mais, bien sûr, le résultat ne sera pas portable, comme le manuel Python vous le rappellera. :-)

J'essaierais plutôt d'utiliser un objet datetime de style nouveau, qui possède des attributs tels que t.year et t.month et t.day, et de les placer dans le 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'opérateur "".format() si votre Python en est équipé et soyez encore plus moderne; il a aussi beaucoup d'options de format pour les nombres. Voir: http://docs.python.org/library/string.html#string-formatting .

1
Brandon Rhodes

%d prend en charge les deux (zéro non significatif) en Python 3.6.5 (et dans les versions ultérieures, espérons

 enter image description here

0
Kshitij
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
0
user7503128

utiliser, par exemple, "% -d" n'est pas portable, même entre différentes versions du même système d'exploitation . Une meilleure solution consisterait à extraire les composants de date individuellement et à choisir entre des opérateurs de formatage spécifiques à la date et un accès par attribut de composant.

e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
0
Chris Chewa