这个星期和时间是否已经过了本周或没有 - PHP

时间:2016-03-25 14:16:17

标签: php time

我有一个存储在数组中的一天和一周中的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"

能否让我准备好与我的变量进行比较的当前值,但我迷失了逻辑如何确定我的时间本周是否已经过去?

非常感谢任何帮助。

3 个答案:

答案 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']) {

演示:https://eval.in/542298

确保您正确设置了时区,否则午夜时分可能会让您失去一天。