2009-09-04 242 views
0

我需要计算(使用python)用户输入了多少时间,是否输入类似3:30或3.5的东西。我不确定最好的方法是什么,我想我会征求专家的意见。用Python计算用户输入时间

===编辑==================

为了更加清晰地明确,我希望用户输入小时和分钟或只有几分钟的路程。我希望他们能够以hh:mm(3:30或03:30)或浮动(3.5)小时两种格式输入时间。

总体目标是跟踪他们工作的时间。所以,我会增加他们进入的时间来获得总数。

回答

0

有几种可能的解决方案,但在某些时候你会遇到模棱两可的情况,导致任意转换。总的来说,我会建议采取任何输入和解析分隔符(无论是:或。或其他),然后根据您定义的单位的一些模式转换为秒。

或者,您可以执行一系列try/except语句,以针对不同的时间格式方案测试它,以查看它是否匹配。

我不知道会是最好的,你的情况是什么?

1

你能精确地定义了允许用户输入字符串的语法?一旦你这样做了,如果它足够简单,它可以通过简单的Python字符串表达式匹配,否则你可能会更好用pyparsing或类似的东西。此外,精确的语法将使识别任何歧义变得更加容易,因此您可以更改规则(以避免输入字符串含糊不清),或者至少确定如何解释它们(并为用户的利益记录事实! )。

编辑:鉴于OP的澄清(HH:MM或只有几分钟的路程为float)看似简单:

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 

您可能希望获得更细粒度的-诊断到底是什么问题,用户输入可能有(当你接受和解析用户输入时,99%的努力会用来识别令人难以置信的[[删除]]错误:这很难让你的代码万无一失,因为傻瓜确实非常愚蠢!帮助你开始。

0

首先,你需要一些约定。是3.55分钟到4小时,5毫秒到4秒,还是3和55/100分钟/小时/秒?这同样适用于3:55。至少要区分点和冒号,指定点代表分数和冒号,分隔符为小时/分钟/秒。

虽然你还没有指定“时间”是什么(自从或点钟?),你也需要这样做。

然后,它很简单,只需要最后一次表达您想要使用的时间,然后继续转换输入,直到达到最终表示形式。假设您决定最终应将时间表示为MM:SS(两位数分钟,一个冒号,两位数秒),您需要在字符串中搜索允许出现的字符,并相应地采取行动。例如,不允许同时使用冒号和点。如果只有一个冒号,那么你有一个分数,因此你将第二部分当作60的一部分。

继续这样做,直到你有最后的表示,然后只是做你应该做的与“时间”。

我不知道你在处理什么限制,但如果不是一个单一的“时间”输入,而是你有两个问题,问题可能会缩小:第一个是人们输入小时的地方,第二个,他们在那里键入分钟。当然,只有当您可以分割输入时,这才会起作用...

+0

不好意思,但一毫秒是1/1000秒,所以3.55秒实际上是450毫秒短于4秒。不知道你会怎么想出5,除非你认为毫秒是1/60秒? – 2009-09-04 02:37:36

+0

@John Y没问题,因为注意到:) – inerte 2009-09-04 02:53:47

0

这是我们在我们的一个内部Web应用程序中使用的代码,我们使用时间跟踪目的。当用户输入时间时,字符串值将通过此函数传递,该函数返回时间数据结构。

它是用javascript编写的,代码可以直接移植到python。

我希望它有一点帮助。

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

感谢gahooa,这很有趣 – Joe 2009-09-04 13:08:44

0

你能有GUI做到这一点,限制用户输入?处理文本似乎是超级错误,否则(在用户方面,更不用说程序员),并且工作了几个小时......你想要正确地做到这一点。