从输入字段中减去小时和分钟

  • 本文关键字:小时 分钟 字段 php
  • 更新时间 :
  • 英文 :


我有一个有五个输入字段的表单:

name="MultiRoomFromDate"  //outputs the date in the following format "d-m-Y"
name="MultiRoomFromTimeH" // has a dropdown of "00" to "23"
name="MultiRoomFromTimeM" // has a dropdown of "00" to "59"

<select name="MultiFromDisplayTimeH" id="MultiFromDisplayTimeH" class="FormTime">
<option value="0">0</option>
<option value="3600">1</option>
<option value="7220">2</option>
<option value="10800">3</option>
<option value="14400">4</option>
</select>
<select name="MultiFromDisplayTimeM" id="MultiFromDisplayTimeM" class="FormTime">
<option value="0">0</option>
<option value="900">15</option>
<option value="1800">30</option>
<option value="2700">45</option>
</select>

如果我选择"MultiRoomFromDate"作为26-01-2020,MultiRoomFromTimeH作为"09",MultiRoomFromTimeM作为"00",选择"MultiFromDisplayTimeH"作为"01","MultiFromDisplayTimeM"作为"00"并提交表格,输出为:

FromDate = MultiRoomFromDate; //26-1-2020
FromHours = MultiRoomFromTimeH; //09
FromMins = MultiRoomFromTimeM; //00
DisplayHours = MultiFromDisplayTimeH; //3600
DisplayMins = MultiFromDisplayTimeM; //0

我需要做的是将"FromDate, FromHours, FromMins"减去"DisplayHours" 和 "DisplayMins" 作为 Y-m-d H:i。

这是我一直在使用的:

$MultiRoomFromDate = trim($_POST['MultiRoomFromDate']);
$MultiFromDisplayTimeH = trim($_POST['MultiFromDisplayTimeH']);
$MultiFromDisplayTimeM = trim($_POST['MultiFromDisplayTimeM']);
$FromdateStamp = strtotime($MultiRoomFromDate);
$TodateStamp = strtotime($MultiRoomToDate );
$DisplayTime = $FromTimeStamp - $FromDisplayHours - $FromDisplayMins;
$DisplayDateTime = date("Y-m-d H:i", $DisplayTime);
$RoomFromTime = $MultiRoomFromTimeH.":".$MultiRoomFromTimeM;
if(!empty($MultiFromDisplayTimeH)) {
$DisplayTime1 = date('Y-m-d H:i:s', strtotime("-". $MultiFromDisplayTimeH." hours", strtotime($MultiRoomFromDate." ". $RoomFromTime))); 
} 
if(!empty($MultiFromDisplayTimeM)) {
$DisplayTime = date('Y-m-d H:i:s', strtotime("-". $MultiFromDisplayTimeM." minutes", strtotime($DisplayTime1))); 
}   
if(empty($MultiFromDisplayTimeH) && empty($MultiFromDisplayTimeM)){
$DisplayTime = date('Y-m-d H:i', strtotime($DisplayDateTime));
}

还尝试过:

$t = $MultiFromDisplayTimeH + $MultiFromDisplayTimeM;
$RoomFromTimeStamp = strtotime($MultiRoomFromDate);
$h = $RoomFromTimeStamp - $t;
$DisplayTime = date("Y-m-d H:i:s",$h);

首先,通过删除value属性来简化您的选择选项语法 - 它只会使您的标记更难一目了然地理解,并且对于我稍后将演示的日期时间计算来说,这将是不必要的。 我也认为更简单的字段名称将是有益的。

<select name="subtractHours" class="FormTime">
<option>0</option>
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
</select>
<select name="subtractMinutes" class="FormTime">
<option>0</option>
<option>15</option>
<option>30</option>
<option>45</option>
</select>

然后,使用 PHP 的日期时间类执行以下操作:

  1. 从日期/时间值初始化日期时间对象
  2. 减去提交的时间量
  3. 将日期时间字符串调整为所需的格式。

代码:(演示(

$fromDate = '26-1-2020';
$fromHours = '09';
$fromMins = '00';
$subtractHours = '1';
$subtractMins = '0';
$format = 'Y-m-d H:i:s';
$date = DateTime::createFromFormat('d-m-Y H:i:s', "{$fromDate} {$fromHours}:{$fromMins}:00");
$date->sub(new DateInterval("PT{$subtractHours}H{$subtractMins}M"));
echo $date->format('Y-m-d H:i');

输出:

2020-01-26 08:00

我将:00以秒的形式添加到对象中以实现稳定性/一致性,以防您想将完整的日期时间戳插入数据库(这将需要Y-m-d H:i:s格式(。


当时间减去导致损失一天时,上述情况也会处理。 (演示(

$fromDate = '25-1-2020';
$fromHours = '01';
$fromMins = '30';
$subtractHours = '6';  // don't bother with 3600 precalculation
$subtractMins = '45';
// Output: 2020-01-24 18:45

我完全重写了我的代码,现在我使用以下代码解决了这个问题:

$DisplayTime = $FromTimeStamp - $FromDisplayHours - $FromDisplayMins;
echo "DISPLAYTIME 1 ".$DisplayTime."<br/>";
$DisplayDateTime = date("Y-m-d H:i", $DisplayTime);

最新更新