我有一个凭证系统,我可以用时间输入日期或日期。应该允许所有有效格式,例如:
如果我有优惠券的开始日期,我没问题,但如果我有结束日期则会出现问题。我使用strtotime
将用户输入转换为UNIX时间戳。
如果您只是将日期输入结束日期,则应该是当天结束时使用的日期。像这样:
01.01.2016 -> 01.01.2016 23:59:59 -> 1451689199
但是 - 这是我的问题 - strtotime
当然会为01.01.2016
和01.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初学者的基本问题,与此问题完全无关!
答案 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;