strtotime:检查时间

5
我有一个凭证系统,我可以输入日期或日期和时间。所有有效的格式都应该被允许,例如以下格式:
  • 01.01.2016
  • 01.01.2016 00:00:00
如果我有开始日期来使用一个凭证,这个没有问题。但是如果我有结束日期就会出现问题。我使用strtotime将用户输入转换为UNIX时间戳。
如果您只输入日期作为结束日期,它应该是当天最后一秒钟。就像这样:
01.01.2016 -> 01.01.2016 23:59:59 -> 1451689199

但是,这是我的问题——strtotime对于2016年1月1日2016年1月1日 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个回答

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

这是一个想法;-) 我会检查一下 :-) - Richard

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。

基本上,这是一个验证格式的好想法。但是,我必须实现PHP所知道的所有DateTime格式... - Richard

0
根据您提供的时间戳,输入的 Unix Epoch 转换都是 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时间戳是否为明确设置的时间。


是的,但问题是,我想知道是否已设置时间。如果有人将时间明确设置为00:00:00会怎样呢?;-) 默认值不应该是00:00:00,而应该是23:59:59,换句话说就是这样。 - Richard
你想在用户端更改时间?用户界面有哪种输入结束日期的方法?我会查看前端反馈,以确定时间是否被明确设置。 - RepeatQuotations
我只有一个日期/时间的文本字段,并尝试使用strtotime解析输入的值。当然,我可以集成一个日期选择器... - Richard

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";
}

?>


是的,但问题是我想知道是否已设置时间。默认值不应为00:00:00,而应为23:59:59,换句话说。 - Richard
在这种情况下,您可以在提交表单时添加一个布尔值,以确定时间是否由用户设置。如果没有设置,则将00:00:00替换为23:59:59。 - eselskas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接