strtotime:检查时间

时间:2015-07-09 09:31:21

标签: php date strtotime

我有一个凭证系统,我可以用时间输入日期或日期。应该允许所有有效格式,例如:

  • 2016年1月1日
  • 01.01.2016 00:00:00

如果我有优惠券的开始日期,我没问题,但如果我有结束日期则会出现问题。我使用strtotime将用户输入转换为UNIX时间戳。

如果您只是将日期输入结束日期,则应该是当天结束时使用的日期。像这样:

01.01.2016 -> 01.01.2016 23:59:59 -> 1451689199

但是 - 这是我的问题 - strtotime当然会为01.01.201601.01.2016 00:00:00返回相同的时间戳。当用户输入时,当然应该使用这个时间。

01.01.2016
1451602800
-> should go to 1451689199

01.01.2016 00:00:00
1451602800
-> is correct

01.01.2016 23:59:59
1451689199
-> is correct

我需要有可能检查字符串 - 由strtotime转换 - 是否有明确的时间。我搜索了一个没有成功的函数,即使DateTime类没有这方法(hasTime()或类似的东西)。

正如我之前所说,此功能也应支持所有日期/时间格式strtotime支持。

这个问题不重复!我想检查是否有明确指定的时间。应该是重复的问题是PHP初学者的基本问题,与此问题完全无关!

4 个答案:

答案 0 :(得分:1)

我在调用strtotime之前测试字符串的长度并添加23:59:59

$dates = array('01.01.2016','01.01.2016 23:59:59','01.01.2016 10:25:30');
foreach($dates as $date) {
    echo "date=$date\n";
    if (strlen($date) > 10) {
        echo strtotime($date),"\n";
    } else {
        echo strtotime($date . ' 23:59:59'),"\n";
    }
}

<强>输出:

date=01.01.2016
1451689199
date=01.01.2016 23:59:59
1451689199
date=01.01.2016 10:25:30
1451640330

答案 1 :(得分:0)

如果输入'2015031''2015031 10:39',您可以基本尝试第一个,如果返回false则尝试另一个。

不保证稳健性

php > var_dump(DateTime::createFromFormat('Ymd H:s','2015031'));
 bool(false)
php > var_dump(DateTime::createFromFormat('Ymd H:s','2015031 10:29'));
 object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2015-03-01 10:00:29.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

显然,根据需要更改格式,并使用->getTimestamp提取TS。

答案 2 :(得分:0)

根据您提供的时间戳判断,作为输入的unix时期转换均为GMT时间。如果是这种情况,您可以尝试使用gmdate函数对显式设置时间进行基本检查,并假设如果它们具有值,则它是用户修改的时间戳。

如果没有,可以修改时间戳,并可以将23小时59分59秒的余额添加到日期。

<?php
  $unixstamp = '1451520000'; // Thu, 31 Dec 2015 00:00:00 GMT
  $day = gmdate( 'Y-m-d', $unixstamp ); // 2015-12-31
  $hour = (int)gmdate( 'H', $unixstamp); // 0
  $minute = (int)gmdate( 'i', $unixstamp ); // 0 

  //check if hours or minutes have been set explicitly 
 if( $hour > 0 || $minute > 0 ){
   //User Modified Time
   echo gmdate("c",$unixstamp);

 } else {
   //here add the 23 hours and 59 minutes on and return as date object
   echo gmdate("c", strtotime('+23 hours + 59 minutes + 59 seconds', $unixstamp));  

   //here add the 23 hours and 59 minutes on and return as unix epoch timestamp
   $endofday = gmdate("U", strtotime('+23 hours + 59 minutes + 59 seconds', $unixstamp));   
 }
?>

时区肯定是一个考虑因素,但上面的代码将检查GMT unix时间戳以明确设置时间。

答案 3 :(得分:0)

默认情况下,所有时间戳都包含时间,即使未设置,也会是00:00:00。

所以在这种情况下,你可以这样做:

<?php 

$notime = 1420070400;
$withtime = 1420110000;


$time = date("H:i:s", $withtime);

if($time == "00:00:00") {
    echo "time not set";
} else {
    echo "time set";
}

&GT;