使用正则表达式检查时间

时间:2013-01-08 20:49:48

标签: javascript jquery html

我有以下功能:

    function calcTotal(event)
    {var myId = event.currentTarget.id;

    myId = myId.replace(/[^0-9]/g, '');

    var timeRegex = /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/;

    if($('#start'+myId).val().match(timeRegex) && $('#end'+myId).val().match(timeRegex) &&    $('#pause'+myId).val().match(timeRegex))
    {   alert('win');
        var minutes = 0;

        var n = $('#end'+myId).val().split(':');
        minutes = parseInt(n[0])*60 + parseInt(n[1]);

        var n = $('#start'+myId).val().split(':');
        minutes -= parseInt(n[0])*60 + parseInt(n[1]);

        var n = $('#pause'+myId).val().split(':');
        minutes -= parseInt(n[0])*60 + parseInt(n[1]);

        var hours = Math.floor(minutes/60);
        minutes = minutes % 60;
        alert(hours + ':' + minutes);
        $('#total' + myId).val(hours + ':' + minutes);
    }
    else
    {   alert('fail');
        $('#total' + myId).val('00:00');
    }

    }   
   </script>

假设myID等于1,并且let假设以下值:

start1 = 00:00
end1 = 10:00
pause1 = 02:00

我希望此函数将前三个值与正则表达式匹配,以确定它们是否为有效时间。 之后我想计算当天的总工作时间:end1-start1-pause1。 由于某些原因,即使使用这些正确的值,函数nevers也会输入if(....){alert('win')...}。

我认为我的正则表达式有问题,但我已经检查过(stackoverflow question)并使用了该正则表达式。

有人能告诉我我做错了吗?

整个代码:

<?php
if(isset($_POST['date']))
{       $sql = "INSERT INTO `hour_administration`.`hours` (`h_id`, `date`, `start`, `end`) VALUES";
    foreach($_POST['date'] as $k => $v)
    {
        if(empty($_POST['date'][$k]))
        break;
        if($k > 0)      
        $sql .= ",";        
        $sql .= "(NULL, '".$_POST['date'][$k]."',  '".$_POST['start_time'][$k].":00',  '".$_POST    ['end_time'][$k].":00')";

    }
    $sql .= ";";
    echo " Query: ".$sql. "</BR>";
    mysql_query($sql) or die('Could not query: ' . mysql_error());
}

if(isset($_POST['rows']))
{
    $rows = $_POST['rows'];
}else
{
$rows = 5;  
}




?>
<script>
$(document).ready(function() { 

    $( ".date" ).datepicker({ dateFormat: "yy-mm-dd" });
    $(".time").mask("99:99");           
    $('.start_time').change(function(e) {               
            calcTotal(e);

    });

    $('.end_time').change(function(e) {     
        calcTotal(e);

    });

    $('.pause').change(function(e) {        
        calcTotal(e);

    });
});

function calcTotal(event)
{   var myId = event.currentTarget.id;  
    myId = myId.replace(/[^0-9]/g, ''); 

    var timeRegex = /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/;

    if($('#start'+myId).val().match(timeRegex) && $('#end'+myId).val().match(timeRegex) && $('#pause'+myId).val().match(timeRegex))
    {   
        var minutes = 0;

        var n = $('#end'+myId).val().split(':');
        minutes = parseInt(n[0])*60 + parseInt(n[1]);

        var n = $('#start'+myId).val().split(':');
        minutes -= parseInt(n[0])*60 + parseInt(n[1]);

        var n = $('#pause'+myId).val().split(':');
        minutes -= parseInt(n[0])*60 + parseInt(n[1]);

        var hours = Math.floor(minutes/60);
        minutes = minutes % 60;
        alert(hours + ':' + minutes);
        $('#total' + myId).val(hours + ':' + minutes);
    }
    else
    {   alert($('#start'+myId).val());
        $('#total' + myId).val('00:00');
    }

}   
   </script>

<div class="inner_container">
  <form name="input" method="POST" id="input">
    <table border="1">
      <tr>
        <td>Date</td>
        <td>Start time</td>
        <td>End time</td>
        <td>Pause</td>
        <td>Total</td>
      </tr>
      <tr>
        <?php for($i = 0;$i < $rows;$i++)
        {?>
        <td><input type="text" class="date" name="date[]" id="start<?php echo $i;?>"></td>
        <td><input type="text" class="start_time time"  name="start_time[]" id="start<?php echo $i;?>"></td>
        <td><input type="text" class="end_time time" name="end_time[]" id="end<?php echo $i;?>" ></td>
        <td><input type="text" class="pause time" name="pause[] " id="pause<?php echo $i;?>"></td>
        <td><input type="text" class="total" name="total[]" id="total<?php echo $i;?>"></td>
      </tr>
      <?php }?>
    </table>
    <input type="submit" id="submit_inner_container"value="Submit">
  </form>
  <form name="amount" method="POST">
    <label for="name">How many rows would you like?</label>
    <input type="text" name="rows" size="3" id="rows" value="<?php echo $rows; ?>"/>
    <input type="submit" value="Rows"
  </form>
</div>

3 个答案:

答案 0 :(得分:1)

您的HTML显示您有两个具有相同id属性的输入字段:

    <td><input type="text" class="date" name="date[]" id="start<?php echo $i;?>"></td>
    <td><input type="text" class="start_time time"  name="start_time[]" id="start<?php echo $i;?>"></td>

这里的第一个是否应该使用“date”而不是“start”?

答案 1 :(得分:0)

var timeRegex = /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/;

timeRegex.test('00:00') // true
timeRegex.test('10:00') // true
timeRegex.test('02:00') // true

意味着您的问题不在于正则表达式,我没有看到if语句的问题。问题必须是选择器或文本框中的值。我会在val中查找空格或其他字符。

答案 2 :(得分:0)

正则表达式工作正常。

请参阅此jsfiddle

var timeRegex = /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/;
var start = "00:00"
var end = "10:00"
var pause = "02:00"

if(start.match(timeRegex) && end.match(timeRegex) && pause.match(timeRegex))
{   
  alert('win');
}
else
{   
  alert('fail');
}

如果您想要更多答案,请发布您的选择器正在访问的HTML代码