258 votes

Formatage d'une date en une chaîne de caractères avec des millisecondes

Comment puis-je formater un datetime en tant que chaîne de caractères avec des millisecondes ?

1 votes

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 avec strftime('%Y-%m-%dT%H:%M:%S.%fZ')

1voto

arntg Points 101
python -c "from datetime import datetime; print str(datetime.now())[:-3]"
2017-02-09 10:06:37.006

1voto

Hunaphu Points 136
datetime
t = datetime.datetime.now()
ms = '%s.%i' % (t.strftime('%H:%M:%S'), t.microsecond/1000)
print(ms)
14:44:37.134

1voto

Mike T. Points 89

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

0voto

mato Points 392

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

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é.

0voto

muntoo Points 4905

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X