2009-09-04 4 views
0

J'ai besoin de calculer (en utilisant python) combien de temps un utilisateur a entré, si elles ont entré quelque chose comme 3:30 ou 3.5. Je ne suis pas vraiment sûr de la meilleure façon d'y parvenir et je pensais demander conseil aux experts.calculer l'heure entrée par l'utilisateur avec Python

=== Modifier ==================

Pour spécifier plus clairement, je veux que l'utilisateur heures d'entrée et minutes ou quelques minutes. Je veux qu'ils puissent entrer l'heure dans deux formats, soit en hh: mm (3:30 ou 03:30) ou en flottant (3.5) heures.

L'objectif global est de garder une trace du temps qu'ils ont travaillé. Donc, je vais ajouter le temps qu'ils passent pour obtenir un total.

Répondre

0

Il existe quelques solutions possibles, mais à un moment donné, vous allez rencontrer des cas ambigus qui entraîneront des conversions arbitraires. Dans l'ensemble, je suggère de prendre n'importe quelle entrée et d'analyser les séparateurs (que ce soit: ou ou quelque chose d'autre) et de convertir en secondes en fonction du schéma des unités que vous avez définies.

Alternativement, vous pouvez faire une série d'instructions try/except pour le tester par rapport à différents schémas de formatage de l'heure pour voir si cela correspond.

Je ne sais pas ce qui sera le mieux dans votre cas ...

1

Pouvez-vous définir précisément la syntaxe des chaînes que l'utilisateur est autorisé à entrer? Une fois que vous faites cela, si c'est assez simple, il peut être mis en correspondance avec de simples expressions de chaîne Python, sinon vous pouvez être mieux avec pyparsing ou similaire. De plus, une syntaxe précise facilitera l'identification des ambiguïtés de sorte que vous pouvez soit changer les règles (de sorte qu'aucune chaîne d'entrée ne soit jamais ambiguë) ou au moins décider précisément comment les interpréter (ET documenter le fait pour le bénéfice de l'utilisateur!).

modifier: il semble simple:

while True: 
    s = raw_input('Please enter amount of time (hh:mm or just minutes):') 
    try: 
     if ':' in s: 
     h, m = s.split(':') 
     else: 
     h = '' 
     m = s 
     t = int(h)*3600 + float(m)* 60 
    except ValueError, e: 
     print "Problems with your input (%r): %s" % (s, e) 
     print "please try again!" 
    else: 
     break 

Vous pouvez obtenir plus fin pour diagnostiquer exactement quel problème l'entrée de l'utilisateur: compte tenu de la précision apportée OP (en flottant mm ou à quelques minutes hh) peut avoir (quand vous acceptez et analyser l'entrée de l'utilisateur, 99% de l'effort est dans l'identification incroyablement [[expletive supprimé]] des erreurs: il est très difficile de rendre votre code infaillible, parce que les imbéciles sont INGENUOUS! -), mais cela devrait vous aider à démarrer.

0

Tout d'abord, vous aurez besoin de conventions. Est-ce que 3,55 cinq minutes à quatre heures, cinq millisecondes à quatre secondes, ou 3 et 55/100 d'une minute/heure/seconde? La même chose s'applique à 3:55. Au moins faire une distinction entre point et deux points, en spécifiant qu'un point signifie une fraction et un deux-points, un séparateur de heure/minute/seconde.

Bien que vous n'ayez pas spécifié ce qu'est "l'heure" (depuis ou vers?), Vous en aurez également besoin. Ensuite, il suffit simplement d'avoir une représentation finale de l'heure avec laquelle vous voulez travailler, et de continuer à convertir l'entrée jusqu'à ce que votre représentation finale soit atteinte. Supposons que vous décidiez que l'heure devrait être représentée par MM: SS (deux chiffres pour les minutes, deux points, deux chiffres pour les secondes), vous devrez rechercher la chaîne pour les occurrences autorisées de caractères, et agir en conséquence. Par exemple, avoir un deux-points et un point en même temps n'est pas autorisé. S'il y a un seul deux-points, vous avez une fraction, donc vous allez traiter la seconde partie comme une fraction de 60.Continuez à faire cela jusqu'à ce que vous ayez votre représentation finale, puis faites ce que vous avez à faire avec le "temps" indiqué ci-dessus. Je ne sais pas sur quelles contraintes vous travaillez, mais le problème pourrait être réduit si au lieu d'une seule entrée "time", vous en aviez deux: la première, où les gens tapent les heures, et la seconde , où ils tapent les minutes. Bien sûr, cela ne fonctionnera que si vous pouvez diviser l'entrée ...

+0

Désolé de nitpick, mais une milliseconde est 1/1000 de seconde, donc 3,55 secondes est en fait 450 millisecondes à court de 4 secondes. Vous ne savez pas comment vous en viendriez à 5, à moins que vous pensiez qu'une milliseconde était 1/60 de seconde? –

+0

@John Y Aucun problème avec le nitpicking, merci de le remarquer :) – inerte

0

Ceci est le code que nous avons dans l'une de nos applications Web internes que nous utilisons pour time-tracking fins. Lorsque l'utilisateur entre une heure, la valeur de chaîne est passée à travers cette fonction, qui renvoie une structure de données de temps.

Il est écrit en javascript, et le code pourrait être directement porté sur python.

J'espère que cela aide un peu.

var ParseTime_NOW_MATCH = /^ *= *$/ 
var ParseTime_PLUS_MATCH = /^ *\+ *([0-9]{0,2}(\.[0-9]{0,3})?) *$/ 
var ParseTime_12_MATCH = /^ *([0-9]{1,2}):?([0-9]{2}) *([aApP])[mM]? *$/ 
var ParseTime_24_MATCH = /^ *([0-9]{1,2}):?([0-9]{2}) *$/ 


// ######################################################################################## 
// Returns either: 
// { 
//  Error: false, 
//  HourDecimal: NN.NN, 
//  HourInt: NN, 
//  MinuteInt: NN, 
//  Format12: "SS:SS SS", 
//  Format24: "SS:SS" 
// } 
// or 
// { 
//  Error: true, 
//  Message: "Error Message" 
// } 
function ParseTime(sTime) 
{ 
    var match; 

    var HH12; 
    var HH24; 
    var MM60; 
    var AMPM; 

    /////////////////////////////////////////////////////////////////////////////////////// 
    if((match = ParseTime_NOW_MATCH.exec(sTime)) != null) 
    { 
//    console.log(match); 
     return {Error: true, Message: "Unsupported format"}; 
    } 
    /////////////////////////////////////////////////////////////////////////////////////// 
    else if((match = ParseTime_PLUS_MATCH.exec(sTime)) != null) 
    { 
//    console.log(match); 
     return {Error: true, Message: "Unsupported format"}; 
    } 
    /////////////////////////////////////////////////////////////////////////////////////// 
    else if((match = ParseTime_24_MATCH.exec(sTime)) != null) 
    { 
//    console.log("24"); 
//    console.log(match); 
     HH24 = parseInt(match[1], 10); 
     MM60 = parseInt(match[2], 10); 

     if(HH24 > 23 || MM60 > 59) 
     { 
      return {Error: true, Message: "Invalid Hour or Minute (24)."}; 
     } 
     else if(HH24 == 0) 
     { 
      HH12 = 12; 
      AMPM = 'AM'; 
     } 
     else if(HH24 <= 11) 
     { 
      HH12 = HH24; 
      AMPM = 'AM'; 
     } 
     else if(HH24 == 12) 
     { 
      HH12 = HH24; 
      AMPM = 'PM'; 
     } 
     else 
     { 
      HH12 = HH24 - 12; 
      AMPM = 'PM'; 
     } 

    } 
    /////////////////////////////////////////////////////////////////////////////////////// 
    else if((match = ParseTime_12_MATCH.exec(sTime)) != null) 
    { 
//    console.log(match); 
     AMPM = ((match[3] == 'A' || match[3] == 'a') ? 'AM' : 'PM'); 
     HH12 = parseInt(match[1], 10); 
     MM60 = parseInt(match[2], 10); 

     if(HH12 > 12 || HH12 < 1 || MM60 > 59) 
     { 
      return {Error: true, Message: "Invalid Hour or Minute (12)."}; 
     } 
     else if(HH12 == 12 && AMPM == 'AM') 
     { 
      HH24 = 0; 
     } 
     else if(AMPM == 'AM') 
     { 
      HH24 = HH12; 
     } 
     else if(AMPM == 'PM') 
     { 
      HH24 = HH12 + 12; 
     } 
    } 
    /////////////////////////////////////////////////////////////////////////////////////// 
    else 
    { 
     return {Error: true, Message: "Invalid Time Format."}; 
    } 

    return { 
     Error  : false, 
     HourDecimal : HH24 + (MM60/60), 
     HourInt  : HH24, 
     MinuteInt : MM60, 
     Format12 : HH12 + ':' + (MM60 < 10 ? "0"+MM60 : MM60) + ' ' + AMPM, 
     Format24 : (HH24 < 10 ? "0"+HH24 : HH24) + ':' + (MM60 < 10 ? "0"+MM60 : MM60) 
    } 

} 
+0

Merci gahooa, c'est intéressant – Joe

0

Pouvez-vous faire avec une interface graphique et limiter l'entrée d'utilisateur? Le traitement du texte semble super risible autrement (de la part de l'utilisateur, pour ne pas mentionner le programmeur), et pour les heures travaillées ... vous voulez en quelque sorte obtenir ce droit.

Questions connexes