Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP自函数错误以来的时间_Php_Mysql - Fatal编程技术网

PHP自函数错误以来的时间

PHP自函数错误以来的时间,php,mysql,Php,Mysql,我正在编写一个time-since函数来返回给定mysql-datetime之后的时间。从当前时间()获取$oldtime时,当我需要一个正整数时,它返回一个负整数。我以前用其他语言编写过类似的函数,但我对这个问题视而不见,因此非常感谢您的帮助 function timeSince($time){ $today = date("Y"); $oldtime = strtotime($time); $time = time() - $oldtime;

我正在编写一个time-since函数来返回给定mysql-datetime之后的时间。从当前时间()获取$oldtime时,当我需要一个正整数时,它返回一个负整数。我以前用其他语言编写过类似的函数,但我对这个问题视而不见,因此非常感谢您的帮助

function timeSince($time){
        $today = date("Y");
        $oldtime = strtotime($time);
        $time = time() - $oldtime;
        $tokens = array (
            3600 => 'h',
            60 => 'm',
            1 => 's'
        );

        if($time >= 86400){
        }
    }

echo timeSince('2016-02-25 14:35:00');

在您的示例中,
$oldtime
的值必须小于当前的
time()

因此,如果您想计算较大值之间的时间,只需颠倒您的等式:

这一行:
$time=time()-$oldtime

变成:
$time=$oldtime-time()

在您的示例中,
$oldtime
的值必须小于当前的
time()

因此,如果您想计算较大值之间的时间,只需颠倒您的等式:

这一行:
$time=time()-$oldtime

变成:
$time=$oldtime-time()

strotime
在PHP设置中使用时区。根据时区设置,它可能会转换为尚未发生的时间。例如,在我的乌克兰服务器上,
strotime('2016-02-25 14:35:00')
转换为
1456403700
,在另一个时区(美国/太平洋)的服务器上转换为
1456439700

引自PHP文档:

该函数期望得到一个包含英文日期格式的字符串,并将尝试将该格式解析为Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数),相对于now中给出的时间戳,或当前时间(如果未提供now)

此函数的每个参数都使用默认时区,除非该参数中指定了时区。小心不要在每个参数中使用不同的时区,除非是有意的。有关定义默认时区的各种方法,请参见date\u default\u timezone\u get()


您可以将UTC/GMT偏移量添加到日期时间(第一个参数),例如
strotime('2016-02-25 14:35:00+0800')
('2016-02-25 14:35:00 GMT+08:00')
将转换为
1456382100
strotime
在PHP设置中使用时区。根据时区设置,它可能会转换为尚未发生的时间。例如,在我的乌克兰服务器上,
strotime('2016-02-25 14:35:00')
转换为
1456403700
,在另一个时区(美国/太平洋)的服务器上转换为
1456439700

引自PHP文档:

该函数期望得到一个包含英文日期格式的字符串,并将尝试将该格式解析为Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数),相对于now中给出的时间戳,或当前时间(如果未提供now)

此函数的每个参数都使用默认时区,除非该参数中指定了时区。小心不要在每个参数中使用不同的时区,除非是有意的。有关定义默认时区的各种方法,请参见date\u default\u timezone\u get()


您可以将UTC/GMT偏移量添加到日期时间(第一个参数),例如
strotime('2016-02-25 14:35:00+0800')
('2016-02-25 14:35:00 GMT+08:00')
将转换为
1456382100

如果使用PHP的
DateTime
DateInterval
类及其方法,可能会更加方便:

function timeSince($datetime) {
    $now        = strtotime("now");
    $then       = strtotime($datetime);
    $dt_now     = new DateTime("@" . $now);
    $dt_then    = new DateTime("@" . $then);

    //DateTime's diff method returns a DateInterval object which got a format method:
    return $dt_now->diff($dt_then)->format('%a days, %h hours, %i minutes and %s seconds');
}

一些测试用例:

//my local date & time is around "2016-02-25 19:49:00" when testing
echo '<pre>';

echo timeSince('2016-02-25 19:30:00');
//0 days, 0 hours, 19 minutes and 11 seconds
echo PHP_EOL;

echo timeSince('2013-11-02 15:43:12'); 
//845 days, 4 hours, 4 minutes and 3 seconds
echo PHP_EOL;

echo timeSince('2017-01-31 00:22:45'); 
//340 days, 4 hours, 35 minutes and 30 seconds
echo PHP_EOL;

echo timeSince('1950-05-14 07:10:05');
//24028 days, 12 hours, 37 minutes and 10 seconds
echo PHP_EOL;
//测试时,我的本地日期和时间大约为“2016-02-25 19:49:00”
回声';
回声时间间隔('2016-02-25 19:30:00');
//0天0小时19分11秒
echo PHP_EOL;
回音时间间隔('2013-11-02 15:43:12');
//845天4小时4分3秒
echo PHP_EOL;
回声时间间隔('2017-01-31 00:22:45');
//340天4小时35分30秒
echo PHP_EOL;
回声时间间隔('1950-05-1407:10:05');
//24028天12小时37分10秒
echo PHP_EOL;


代码部分基于此答案:

如果使用PHP的
DateTime
DateInterval
类及其方法,可能会更方便:

function timeSince($datetime) {
    $now        = strtotime("now");
    $then       = strtotime($datetime);
    $dt_now     = new DateTime("@" . $now);
    $dt_then    = new DateTime("@" . $then);

    //DateTime's diff method returns a DateInterval object which got a format method:
    return $dt_now->diff($dt_then)->format('%a days, %h hours, %i minutes and %s seconds');
}

一些测试用例:

//my local date & time is around "2016-02-25 19:49:00" when testing
echo '<pre>';

echo timeSince('2016-02-25 19:30:00');
//0 days, 0 hours, 19 minutes and 11 seconds
echo PHP_EOL;

echo timeSince('2013-11-02 15:43:12'); 
//845 days, 4 hours, 4 minutes and 3 seconds
echo PHP_EOL;

echo timeSince('2017-01-31 00:22:45'); 
//340 days, 4 hours, 35 minutes and 30 seconds
echo PHP_EOL;

echo timeSince('1950-05-14 07:10:05');
//24028 days, 12 hours, 37 minutes and 10 seconds
echo PHP_EOL;
//测试时,我的本地日期和时间大约为“2016-02-25 19:49:00”
回声';
回声时间间隔('2016-02-25 19:30:00');
//0天0小时19分11秒
echo PHP_EOL;
回音时间间隔('2013-11-02 15:43:12');
//845天4小时4分3秒
echo PHP_EOL;
回声时间间隔('2017-01-31 00:22:45');
//340天4小时35分30秒
echo PHP_EOL;
回声时间间隔('1950-05-1407:10:05');
//24028天12小时37分10秒
echo PHP_EOL;


代码部分基于此答案:

对于我来说,您的示例的$time值应该为负值,因为它在2016年2月25日还没有到下午2:35。对于我来说,您的示例的$time值应该为负值,因为它在2016年2月25日还没有到下午2:35。或者,使用
abs($time()-$oldtime)谢谢你的回复,据我所知,time()总是返回一个较大的数字,因为它是最近的,这就是为什么我对它有这样的问题。我在其他堆栈查询中看到过类似的情况。我的想法错了吗?干杯。或者,使用
abs($time()-$oldtime)谢谢你的回复,据我所知,time()总是返回一个较大的数字,因为它是最近的,这就是为什么我对它有这样的问题。我在其他堆栈查询中看到过类似的情况。我的想法错了吗?干杯。谢谢你的回复Igor,这可能是问题所在,因为我以前使用过类似的代码,没有遇到过这个问题。我将测试它并报告回来。感谢Igor的回复,这可能是问题,因为我以前使用过类似的代码,没有遇到这个问题。我将测试并报告。谢谢你的帮助,虽然我的具体问题的答案在下面得到了回答,但我想说我同意你的意见,这是一个更简单的解决方案。谢谢你