2012-11-20 4 views
3

En d'autres termes, je cherche l'équivalent de datetime.utcnow() de Python.Haskell: Convertir UTCTime en secondes et millisecondes

Je suis également bien avec un n-tuple contenant des années, des mois et ainsi de suite, jusqu'à millisecondes (ou microsecondes).

J'avais pensé à utiliser show, puis d'analyser la valeur String, mais je crois qu'il y a quelque chose de plus pratique.

+3

Connexes: http://stackoverflow.com/questions/4194340/is-there-a-better-way-to-convert-from-utctime-to-epochtime – katrielalex

Répondre

4

Ré-analyser une chaîne est très non-Haskellish, vous ne le voulez certainement pas.

j'utiliser, de Data.Time.LocalTime,

todSec . localTimeOfDay . utcToLocalTime utc 

qui vous donne secondes dans picoseconde résolution.

0

Secondes et millisecondes depuis quand? Vraisemblablement, il y a une époque (le temps zéro) qui se cache quelque part ici. Vous soustrayez l'époque de l'UTCTime pour obtenir un NominalDiffTime, puis extrayez les secondes et les millisecondes de cette valeur.

secondsSince :: UTCTime -> UTCTime -> (Integer, Int) 
secondsSince t0 t1 = (i, round $ d * 1000) 
    where (i, d) = properFraction $ diffUTCTime t1 t0 

Bien sûr, vous voudrez probablement t0 être 1/1/1970 (l'époque Unix), auquel cas vous importez Data.Time.Clock.POSIX et utilisez utcTimeToPOSIXSeconds, qui retourne un NominalDiffTime.

NominalDiffTime est une instance de (entre autres) Fractional et Num, vous avez donc accès à tous les opérateurs numériques habituels lors de leur manipulation. D'un point de vue arithmétique (y compris les conversions), il est traité comme un nombre de secondes. Lorsque vous utilisez ceci, gardez à l'esprit qu'Unix obtient un temps fondamentalement erroné car il n'a pas de place pour les secondes intercalaires. Il y a une journée avec 86401 secondes au lieu des 86400 habituelles. Dans les années 70, l'idée d'un ordinateur ayant besoin de savoir cela aurait paru absurde (les horloges étaient généralement réglées par le sysadmin consultant sa montre mécanique). Unix time_t compte simplement les secondes depuis l'époque et suppose que chaque jour a exactement 86400 secondes. NominalDiffTime est "nominal" car il fait la même supposition. La bonne chose aurait été de faire de time_t une structure avec un nombre de jours et des secondes depuis minuit comme des champs séparés, et avoir les fonctions arithmétiques de temps consulter une table de secondes intercalaires. Cependant, cela aurait son propre ensemble d'inconvénients, car de nouvelles secondes intercalaires sont désignées de temps en temps, de sorte qu'un programme pourrait donner des résultats différents lorsqu'il est exécuté à des moments différents. Ou pour le dire en termes Haskell, "diffUTCTime" devrait renvoyer un résultat dans la monade IO.

Questions connexes