2010-06-22 12 views

Répondre

10

Oui, il y a une bonne méthode simple que vous pouvez utiliser dans la plupart des langues sans avoir à lire le manuel pour une bibliothèque datetime. Cette méthode peut également être extrapolée à onces/livres/tonne etc etc:

seconds_per_unit = {"s": 1, "m": 60, "h": 3600, "d": 86400, "w": 604800} 

def convert_to_seconds(s): 
    return int(s[:-1]) * seconds_per_unit[s[-1]] 
+0

Haha, +1 et bravo, je suis gêné que cela ne m'est pas arrivé! Je recommande toujours que tout le monde apprenne comment utiliser la bibliothèque 'datetime' et la classe' timedelta' pour ce genre de tâche, car dans de nombreux cas, ce sera l'option la plus pratique. Cependant, je dois avouer que votre solution est meilleure que la mienne pour cette question particulière. –

+0

Oui, c'est une méthode assez simple et élégante pour réaliser ce que je voulais. Merci! – Andrew

7

Je recommande d'utiliser the timedelta class à partir du module datetime:

from datetime import timedelta 

UNITS = {"s":"seconds", "m":"minutes", "h":"hours", "d":"days", "w":"weeks"} 

def convert_to_seconds(s): 
    count = int(s[:-1]) 
    unit = UNITS[ s[-1] ] 
    td = timedelta(**{unit: count}) 
    return td.seconds + 60 * 60 * 24 * td.days 

En interne, timedelta objets tout stocker en microsecondes, secondes et jour. Donc, alors que vous pouvez lui donner des paramètres en unités comme des millisecondes ou des mois ou des années, à la fin, vous devrez prendre le timedelta que vous avez créé et convertir en secondes.

Si la syntaxe ** vous rend confus, c'est la syntaxe Python apply. En gros, ces appels de fonction sont équivalentes:

def f(x, y): pass 

f(5, 6) 
f(x=5, y=6) 
f(y=6, x=5) 

d = {"x": 5, "y": 6} 
f(**d) 
+0

Je te jure que je ne l'ai pas copier votre réponse ;-) +1 et je pense que je vais supprimer le mien. –

Questions connexes