Comment puis-je formater un datetime
en tant que chaîne de caractères avec des millisecondes ?
Réponses
Trop de publicités?Si vous êtes prêt à stocker l'heure dans une variable et à faire un peu de manipulation de chaînes de caractères, vous pouvez le faire sans utiliser le module datetime.
>>> _now = time.time()
>>> print ("Time : %s.%s\n" % (time.strftime('%x %X',time.localtime(_now)),
... str('%.3f'%_now).split('.')[1])) # Rounds to nearest millisecond
Time : 05/02/21 01:16:58.676
>>>
%.3f arrondira à la milliseconde la plus proche, si vous voulez plus ou moins de précision, changez le nombre de décimales.
>>> print ("Time : %s.%s\n" % (time.strftime('%x %X',time.localtime(_now)),
... str('%.1f'%_now).split('.')[1])) # Rounds to nearest tenth of a second
Time : 05/02/21 01:16:58.7
>>>
Testé avec Python 2.7 et 3.7 (il est évident que vous devez omettre les crochets lorsque vous appelez print dans la version 2.x).
Le problème avec datetime.utcnow()
et d'autres solutions de ce type, c'est qu'elles sont lentes.
Une solution plus efficace pourrait ressembler à celle-ci :
def _timestamp(prec=0):
t = time.time()
s = time.strftime("%H:%M:%S", time.localtime(t))
if prec > 0:
s += ("%.9f" % (t % 1,))[1:2+prec]
return s
Où prec
serait 3
dans votre cas (millisecondes).
La fonction fonctionne jusqu'à 9 décimales (veuillez noter que les nombres 9
dans la deuxième chaîne de formatage).
Si vous souhaitez arrondir la partie fractionnaire, je vous suggère de construire "%.9f"
dynamiquement avec le nombre de décimales souhaité.
Spécification du format de la largeur de champ
Le système UNIX date
La commande permet de spécifier %3
pour réduire la précision à 3 chiffres :
$ date '+%Y-%m-%d %H:%M:%S.%3N'
2022-01-01 00:01:23.456
Voici une fonction personnalisée qui peut faire cela en Python :
from datetime import datetime
def strftime_(fmt: str, dt: datetime) -> str:
tokens = fmt.split("%")
tokens[1:] = [_format_token(dt, x) for x in tokens[1:]]
return "".join(tokens)
def _format_token(dt: datetime, token: str) -> str:
if len(token) == 0:
return ""
if token[0].isnumeric():
width = int(token[0])
s = dt.strftime(f"%{token[1]}")[:width]
return f"{s}{token[2:]}"
return dt.strftime(f"%{token}")
Exemple d'utilisation :
>>> strftime_("%Y-%m-%d %H:%M:%S.%3f", datetime.now())
'2022-01-01 00:01:23.456'
NOTE : %%
n'est pas pris en charge.
- Réponses précédentes
- Plus de réponses
1 votes
stackoverflow.com/questions/311627/
4 votes
Veuillez rédiger un titre décrivant votre problème et essayez de poser une question claire et précise.
2 votes
Il convient de mentionner ici qu'une précision supplémentaire est souvent très utile. Par exemple, la fonction
Instant.parse
peut analyser les représentations créées avecstrftime('%Y-%m-%dT%H:%M:%S.%fZ')