用Python计算用户输入时间

时间:2009-09-04 01:40:31

标签: python regex

我需要计算(使用python)用户输入了多少时间,无论他们输入的是3:30还是3.5。我不确定最好的方法是什么,我想我会征求专家的意见。

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

为了更清楚地指定,我希望用户输入小时和分钟或仅几分钟。我希望他们能够以两种格式输入时间,可以是hh:mm(3:30或03:30),也可以是浮动(3.5)小时。

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

5 个答案:

答案 0 :(得分:1)

您能否准确定义允许用户输入的字符串的语法?一旦你这样做,如果它足够简单,它可以通过简单的Python字符串表达式匹配,否则你可能会更好地使用pyparsing等。此外,精确的语法将更容易识别任何歧义,因此您可以更改规则(以便没有输入字符串是模糊的)或至少精确地决定如何解释它们(并记录事实以便用户的利益! - )。

编辑:鉴于OP的澄清(hh:mm或只需几分钟作为浮动),这似乎很简单:

  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%的努力用于识别令人难以置信的[[expletive deleted]]错误:这非常困难让你的代码变得万无一失,因为傻瓜很难接受! - ),但这应该可以帮助你开始。

答案 1 :(得分:0)

有一些可能的解决方案,但在某些时候你会遇到模糊的情况,会导致任意转换。

总的来说,我建议接受任何输入并解析分隔符(无论是:或。或其他),然后根据您定义的单位模式转换为秒。

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

我不确定在你的情况下什么是最好的......

答案 2 :(得分:0)

首先,你需要一些约定。是3.55五分钟到四小时,五毫秒到四秒,还是3分钟和55/100分钟/小时/秒?这同样适用于3:55。至少在点和冒号之间有区别,指定点表示分数和冒号,小时/分钟/秒的分隔符。

虽然你还没有说明“时间”是什么时候(从那时起?),你也需要它。

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

继续这样做,直到你有最后的陈述,然后做你所说的“时间”。

我不知道你正在使用什么约束,但问题可能会缩小,如果不是一个“时间”输入,你有两个:第一个,人们键入小时,第二个,他们输入分钟的地方。当然,这只有在你可以划分输入时才有效...

答案 3 :(得分:0)

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

它是用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)
    }

}

答案 4 :(得分:0)

您可以使用 GUI并限制用户输入吗?处理文本似乎超级容易出错(用户方面,更不用说程序员),并且工作时间......你想要做到这一点。