【问题标题】:PHP subtract unknown time from datetimePHP从日期时间中减去未知时间
【发布时间】:2021-03-23 15:59:16
【问题描述】:

所以,我正在创建一个预订系统。当我从数据库中检索此预订时,我需要检查当前日期和时间是否更接近实际预订的日期和时间。

在管理仪表板上,管理员指定客户可以提前多长时间进行签到,例如 30 分钟。但这一次可能会有所不同。可以是 1 小时、2 小时、10 分钟。

当我从数据库中得到结果时,我得到的结果是这样的:

$date_schedule = '2021-03-25 15:40:00'; // Can be any date in the future as well;
$time_to_check = '00:30:00'; // Can be '01:05:00', whatever the admins set as time_to_check;

// Expected result
'2021-03-25 15:10:00';

我试过减去这个,但没有成功。这就是我所做的。

$current_date = date("Y-m-d H:i:s");
$booking_date = '2021-03-25 15:00:00'; // From database
$time_to_check = '00:30:00'; // From database
$hours = explode(':', $time_to_check);
$data_check = date($booking_date, strtotime('-' . $hours[0] . ' hour -' . $hours[1] . ' minutes'));

但是有了这个,$data_check 会返回与$booking_date 相同的值,而不是减去时间。

【问题讨论】:

  • 这是因为date 函数的第一个参数是format。你给它一个字面日期,这就是它输出的内容,不管后面的时间戳如何。您创建的时间戳会从 当前时间 中减去。使用DateTime类,你可以用modify方法实现同样的事情。
  • 这能回答你的问题吗? Subtract 2 hours from time in php
  • 副本处理固定数量,但原理相同,您已经展示了如何动态构建修改字符串。

标签: php datetime


【解决方案1】:

将您的日期转换为 DateTime 以对其进行一些操作:

function changeDate($date, $interval) {

    $datetime   = new DateTime($date);
    $values     = explode(':', $interval);

    $datetime->modify("-$values[0] hours -$values[1] minutes -$values[2] seconds");

    return $datetime->format('Y-m-d H:i:s');

}

$date   = changeDate('2021-03-25 15:00:00', '00:30:00');
echo $date; // 2021-03-25 14:30:00

$date   = changeDate('2021-03-25 15:00:00', '01:30:00');
echo $date; // 2021-03-25 13:30:00

$date   = changeDate('2021-03-25 15:00:00', '02:30:15');
echo $date; // 2021-03-25 12:29:45

你可以在这里找到文档https://www.php.net/manual/en/book.datetime.php

【讨论】:

  • 这三个对modify 的单独调用可以合二为一。您在分钟旁边还有一个错字,您使用 . 而不是 -
  • 不知道如何使用 DateTime,现在它更容易并且有效!谢谢
【解决方案2】:

只需将时间戳转换为 Unix 时间,然后将 Unix 时间减去 30 分钟(30 * 60)即可。

像这样:

$date =  '2021-03-25 15:10:00';
$timestamp = strtotime($date);
$timestamp = ($timestamp - (30 * 60));
echo gmdate("Y-m-d H:i:s", $timestamp);

编辑:如果你在一个奇怪的时区,像我一样 (GMT+0100) 加减差异;

$timestamp = (($timestamp - (30 * 60)) + (1 * 60 * 60))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多