【问题标题】:Has THIS day and time passed THIS week or not - PHP这天和时间是否已经过去了这周 - PHP
【发布时间】:2016-03-25 14:16:16
【问题描述】:

我有 3 个变量用于存储在数组中的某一天和一周中的某个时间:

$shift['day'];
$shift['hour'];
$shift['meridian'];

所有3个一起,分别输出类似:

Friday 10 PM

根本没有使用 DATE,只使用 DAY 和 TIME,而且它显然没有存储为时间戳。

我如何检查这个 DAY 和 TIME 是否已经过了 THIS 周?

例如:

$today = date("l"); // Get current day "Monday"
$hour = date("g"); // Get current hour "3"
$meridian = date("A"); // Get current meridian "PM"

会让我准备好当前值以与我的变量进行比较,但我不知道逻辑将如何确定我的时间是否已经过去这一周?

非常感谢任何帮助。

【问题讨论】:

  • 你最好使用 JavaScript。 PHP 只在服务器上运行。由于它可以在世界任何地方,因此您需要调整时区。这只是另一罐蠕虫。
  • 获取当天的数值。 N。使用 24 小时制可能比 meridian 更好。
  • @durbnpoisn 不,没关系,我可以用 PHP 做到这一点,因为输出将严格与服务器相关(而不是用户/浏览器/时区)。我只需要知道逻辑。
  • @chris85 我同意,但是如果没有对我的原始变量进行大量转换,这是不可能的。我有一个使用这种方法设置的整个数据库。如果它使逻辑更容易解决,我可以做到吗?

标签: php time


【解决方案1】:

逻辑:

  • 现在创建DateTime 对象
  • Friday 10 PM 创建DateTime 对象。
  • 通过时间戳比较它们,看看哪个更大

代码:

$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-&gt;format('d.m.Y, H:i:s') 产生25.03.2016, 22:00:00。 正确地将日期从“星期五”更改为“星期六”会产生 3 月 26 日,这是我用来验证是否为给定字符串 (Friday 10 PM) 正确创建了 DateTime 对象。

【讨论】:

  • 实际上在玩弄了这里的其他答案之后,事实证明这是唯一一个最可靠的答案。 DateTime API 是我以前没有使用过的东西,但从现在开始我将使用它来处理与日期相关的所有内容。非常感谢 Mjh,这太棒了!
  • 很高兴您发现它很有用,祝您项目顺利,祝您有美好的一天! :)
【解决方案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,它实际上只出现在 DateTimeInterface 的目录中。
一旦你有了它,你只需要知道+- 符号意味着“未来”和“过去”:

if ($now->diff($shift)->format('%R') === '-')
{
    // $shift is in the past; i.e. Friday 10 PM has passed
}

当然,您可以通过date()strtotime() 和数学来复制相同的内容,但这种方式更具表现力且易于理解。

【讨论】:

  • 这太棒了! ;)
【解决方案3】:

您可以使用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

确保您的时区设置正确,否则午夜降临可能会影响这一天。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多