我有一个存储在数组中的一天和一周中的3个变量:
$shift['day'];
$shift['hour'];
$shift['meridian'];
所有3个在一起,分别输出如下内容:
Friday 10 PM
完全没有使用DATE,只是DAY和TIME,它显然没有存储为时间戳。
如何检查本周是否已经过了这个日子和时间?
例如:
$today = date("l"); // Get current day "Monday"
$hour = date("g"); // Get current hour "3"
$meridian = date("A"); // Get current meridian "PM"
能否让我准备好与我的变量进行比较的当前值,但我迷失了逻辑如何确定我的时间本周是否已经过去?
非常感谢任何帮助。
答案 0 :(得分:2)
逻辑:
DateTime
对象DateTime
创建Friday 10 PM
个对象。代码:
$tz = new \DateTimeZone("UTC");
$now = new \DateTime("now", $tz);
$then = \DateTime::createFromFormat('l g A', 'Friday 10 PM', $tz);
if($then->getTimestamp() < $now->getTimestamp())
{
echo 'Friday 10 PM has passed this week';
}
else
{
echo 'No, Friday 10 PM has not passed this week';
}
回应$then->format('d.m.Y, H:i:s')
会产生25.03.2016, 22:00:00
。
将日期从“星期五”更改为“星期六”正确地产生了3月26日,这是我用来验证为给定字符串(DateTime
)正确创建Friday 10 PM
对象。
答案 1 :(得分:2)
DateTime类提供了许多工具来帮助完成此操作,another answer已经使用它,但它迄今为止的最大优势是它实际上允许您纯粹使用日期人类方式 - 你不必为它提供恰好具有数学意义的虚构数字!
所以这是一种方法......
显然,我们需要先创建时间戳进行比较:
// With no arguments, this is just the current timestamp
$now = DateTime();
// Tricky part here is to know that any omitted *calendar-type* values
// default to the current day, while *time* values default to 0s
$shift = DateTime::createFromFormat(
'l g A',
"{$shift['day']} {$shift['hour']} {$shift['meridian']}"
);
但DateTime
类的PHP手册中很难发现(至少在我写这篇文章的时候)DateTime::diff() method实际上只出现在{{1的TOC上}}。
完成后,您只需知道DateTimeInterface
和+
符号表示“未来”和“过去”:
-
当然,您可以通过if ($now->diff($shift)->format('%R') === '-')
{
// $shift is in the past; i.e. Friday 10 PM has passed
}
,date()
和数学复制相同的内容,但这更具表现力和易于理解。
答案 2 :(得分:1)
您可以使用date
函数将值降低为整数,然后只使用条件。
$shift['day'] = 'Friday';
$shift['meridian'] = 'PM';
$hour = '10';
$shift['hour'] = ($shift['meridian'] == 'PM') ? $hour + 12 : $hour; //convert input to 24 hour
$today = date("N");
$current_hour = date("G");
if( date('N', strtotime($shift['day'])) <= $today && $current_hour <= $shift['hour']) {
echo 'It hasn\'t occurred yet this week';
} else {
echo 'It has occurreced this week';
}
......或作为一个班轮(假设$shift['hour']
是24小时):
if( date('N', strtotime($shift['day'])) <= date("N") && date("G") <= $shift['hour']) {
确保您正确设置了时区,否则午夜时分可能会让您失去一天。