web-dev-qa-db-fra.com

Python formatage datetime sans remplissage nul

Existe-t-il un format d'impression Python datetimes qui n'utilisera pas de remplissage nul aux dates et heures?

Format que j'utilise maintenant:

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

Résultat: 29/02/2012 05:03 PM
Souhaité: 29/02/2012 17:03

Quel format représenterait le mois comme '2' au lieu de '02', et l'heure comme '5:03 PM' au lieu de '05: 03PM '

66
Yarin

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

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")
58
Sven Marnach

L'autre alternative pour éviter le "zéro tout ou rien" devant le zéro ci-dessus est de placer un 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 moins devant la journée si vous le souhaitez.

98
ChrisFreeman

Le nouveau système de formatage de chaînes offre une alternative à strftime. C'est assez lisible - en effet, il pourrait être préférable à strftime sur ce compte. Sans oublier le fait qu'il ne fait pas de zéro-pad:

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

Puisque vous voulez probablement un remplissage nul dans le champ minute, 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 spécificateurs standard strftime. Idéalement, pour nos besoins, strftimedoes fournit un code pour le temps de 12 heures complété par un blanc au lieu d'un zéro non significatif:

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

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

84
senderle

La réponse acceptée n'est 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 sous Windows n'est disponible que pour l'exécutable python exécutable. Cela ne fonctionnera pas pour les implémentations cygwin python).

33
user1719826

Bonne réponse de Chris Freeman sur Linux.

Sur Windows, c'est:

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

Pensée qui pourrait aider.

6
user3685285