Mise en forme datetime Python sans remplissage nul

90

Existe-t-il un format d'impression des heures de données Python qui n'utilisera pas de remplissage nul sur les dates et les heures?

Format que j'utilise maintenant:

mydatetime.strftime('%m/%d/%Y %I:%M%p')

Résultat: 29/02/2012 17:03
Désiré: 29/02/2012 17:03

Quel format représenterait le mois sous la forme «2» au lieu de «02» et l'heure sous la forme «5:03 PM» au lieu de «05: 03PM»

Yarin
la source

Réponses:

77

Les options de formatage disponibles avec datetime.strftime()seront toutes zéro-pad. Vous pouvez bien sûr utiliser votre propre fonction de formatage, mais la solution la plus simple dans ce cas pourrait être de post-traiter le résultat de datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")
Sven Marnach
la source
1
Sven- Parce que je veux ressembler à Facebook. Merci!
Yarin
4
En Amérique du Nord, très peu de gens utilisent des heures sans rembourrage pour écrire l'heure à la main.
Eric Walker
2
N'est-ce pas toujours zéro pad le jour du mois?
Judge Maygarden
1
@JudgeMaygarden: C'est pourquoi la solution consiste .lstrip("0")à se débarrasser du zéro de tête.
Sven Marnach
1
Pourquoi je veux supprimer les zéros de pad? Parce que c'est faux par RFC 2822 , par exemple dans le flux de podcast.
Vitaly Zdanevich
165

L'autre alternative pour éviter l'aspect zéro de début "tout ou rien" ci-dessus consiste à placer un signe moins devant le type de champ:

mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

Puis ceci: '4/10/2015 03:00 AM'

Devient: '4/10/2015 3:00 AM'

Vous pouvez éventuellement placer un signe moins devant le jour si vous le souhaitez.

Edit: La fonctionnalité minus dérive de la bibliothèque GNU C («glibc») comme mentionné dans la page de manuel Linux strftime sous «Glibc notes»

ChrisFreeman
la source
48
Excellente réponse, mais Linux uniquement. Ne fonctionnera pas sous Windows. stackoverflow.com/questions/10807164/…
ExactaBox
1
Pourquoi ça marche? Je ne trouve pas de référence à cela dans la documentation pour date.__format__ou time.strftime, docs.python.org/3/library/… et docs.python.org/3.8/library/time.html#time.strftime respectivement
Amin Shah Gilani
1
@AminShahGilani post mis à jour avec la référence src
ChrisFreeman
93

Le nouveau système de formatage des chaînes offre une alternative à strftime. C'est tout à fait lisible - en fait, cela pourrait être préférable pour strftimece compte. Sans parler du fait qu'il ne met pas à zéro:

>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now())
'3/1/2012'

Puisque vous voulez probablement un remplissage nul dans le champ des minutes, vous pouvez le faire:

>>> '{d.month}/{d.day}/{d.year} {d.hour}:{d.minute:02}'.format(d=now)
'3/1/2012 20:00'

Si vous voulez du temps "normal" au lieu du temps "militaire", vous pouvez toujours utiliser les strftimespécificateurs standard . Idéalement, pour nos besoins, strftime ne fournir un code pour la durée de 12 heures épaulette avec vide au lieu d'un zéro:

'{d.month}/{d.day}/{d.year} {d:%l}:{d.minute:02}{d:%p}'.format(d=now)
'4/4/2014  6:00PM'

Cela devient un peu moins lisible, hélas. Et comme le souligne @mlissner, strftimeéchouera sur certaines (toutes?) Plates-formes pour des dates antérieures à 1900.

expéditeur
la source
1
Il existe depuis python 2.6. (Ce n'est pas si nouveau.)
senderle
3
Pour épeler le mois, par exemple, vous pouvez utiliser ce qui suit: "{0.day} {0:%B %Y}".format(d)qui vous donnerait '2 August 2013'comme jour de ce commentaire :)
Jens
2
C'est intéressant, mais cela ne répond pas réellement à OP, car il veut des heures AM / PM. Je ne vais pas vraiment voter contre, mais la réponse acceptée est en fait juste si vous essayez d'obtenir un formatage de date / heure "américain" en python.
Dana Cartwright
Notez que cette technique utilise strftime, qui échouera aux dates antérieures à 1900. Si vous avez des dates anciennes, vous le regretterez.
mlissner
1
fak! Je viens de réaliser où je n'ai pas pointé un autre objet, je l'ai juste passé comme argument de position.
JacobIRR
50

Réponse acceptée pas une solution appropriée (IMHO) Les méthodes documentées appropriées:

Sous Linux, "#" est remplacé par "-":

% -d,% -H,% -I,% -j,% -m,% -M,% -S,% -U,% -w,% -W,% -y,% -Y

Sous Windows, "-" est remplacé par "#":

% # d,% # H,% # I,% # j,% # m,% # M,% # S,% # U,% # w,% # W,% # y,% # Y

#Linux
mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

# Windows
mydatetime.strftime('%#m/%d/%Y %#I:%M%p')

Source: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

Comme indiqué par Sagneta: L'astuce de hachage # sur Windows n'est disponible que pour l'exécutable python natif. cela ne fonctionnera pas pour les implémentations python basées sur cygwin.


la source
3
C'est correct. Notez cependant que l'astuce de hachage # sur Windows n'est disponible que pour les exécutables natifs de Python. En d'autres termes, cela ne fonctionnera pas pour les implémentations python basées sur cygwin.
sagneta
2
C'est génial de savoir mais je suis horrifié par les conséquences. Je teste le formatage de la date retourné par une base de données et je dois réussir le formatage attendu pour chaque test, ce qui ajoute des tonnes de complexité.
Keith
10

Bonne réponse de Chris Freeman sur Linux.

Sous Windows, c'est:

mydate.strftime('%#m/%#d/%Y')

J'ai pensé que cela pourrait aider.

user3685285
la source
0

"% l" (c'est un L minuscule) fonctionne pendant l'heure (au lieu de "% I"). Je ne le sais que par une autre réponse ici

Python strftime - date sans 0 de début?

mais malheureusement, ils n'ont pas le code pour les autres éléments d'une date / heure.

Rob Cranfill
la source