【问题标题】:Split the data into three arrays based on the time根据时间将数据拆分为三个数组
【发布时间】:2015-08-09 11:46:48
【问题描述】:

我想根据时间将数据数组拆分为三个数组 - 过去、今天、以后。

对于今天的数组,只有今天的日期和时间大于今天的时间的数据应该在那里。

这是我的代码。它没有错误(据我所知)。我得到了想要的结果,但我想知道这段代码是否可以更优化。

$current_date = date('Y-m-d');
$current_time = date('H:i:s');

foreach($data as $key => $value) {
    if(date('Y-m-d', $value->meeting_scheduled_at) > $current_date) {
        $calendar_data['later'][] = $value;
    } elseif (date('Y-m-d', $value->meeting_scheduled_at) < $current_date
              || ( (date('Y-m-d', $value->meeting_scheduled_at) == $current_date) 
                   && (date('H:i:s', $value->meeting_scheduled_at) < $current_time) )
    ) {
        $calendar_data['past'][] = $value;
    } else {
        $calendar_data['now'][] = $value;
    }
}

$value-&gt;meeting_scheduled_at 在时间戳中

编辑:我在 Laravel 项目中使用它。

所以,如果会议安排在今天,时间是晚上 6 点。它将进入今天的阵列,直到下午 6 点。下午 6 点之后,它进入过去的数组。简而言之,以后的数组中不应该有任何内容,除非并且直到第二天。

【问题讨论】:

  • 希望你得到了排序。如果您对所提供的任何答案感到满意,请确保选择您喜欢的答案。

标签: php arrays datetime laravel


【解决方案1】:

您可以改用时间戳。

$now = time();
$today_limt = strtotime("today 6 PM");

 foreach($data as $key => $value) {
        $meeting_time = strtotime($value->meeting_scheduled_at);
        if($meeting_time > $today_limit) {
            $calendar_data['later'][] = $value;
        } elseif($meeting_time < $now) {
            $calendar_data['past'][] = $value;
        } else {
            $calendar_data['now'][] = $value;

        }
 }

【讨论】:

  • 这里的问题是任何东西都不会被归类为now,并且从今天开始的所有东西,即使是那些已经通过的东西也会被归类为later
  • 怎么样? $today 表示直到今天晚上 11:59:59。因此,如果任何会议时间大于$today 午夜,则应该更晚。 Noted:我没有检查LESS THAN它是GREATER THAN
  • 实际上,$today = strtotime("today")-1; 评估为昨天 23:59:59。即 2015-05-26 23:59:59(我当前的日期是 2015-05-27)。自己试试吧:echo date('Y-m-d H:i:s', strtotime('today') -1); 我想你的意思是tomorrow 不是todaystrtotime
  • @KevinNagurski 对不起我的错误。我的意思是 Tomorrow-1 。答案已更新。谢谢
  • 所以,如果会议安排在今天的日期,时间是晚上 6 点。它将进入today 数组,直到下午 6 点。下午 6 点之后,它进入past 数组。简而言之,later array 中不应该有任何内容,除非并且直到第二天。
【解决方案2】:

我喜欢使用 DateTime 类来处理这种事情。它考虑了夏令时等,并且可以很容易地进行比较。

$now         = new DateTime();
$tomorrow    = new DateTime();
$meetingDate = new DateTime();

$tomorrow->add(new DateInterval('P1D'))->setTime(0,0,0);

foreach ($data as $key => $value) {
    $meetingDate->setTimestamp($value->meeting_scheduled_at);

    // if $value->meeting_scheduled_at format YYYY-MM-DD then
    // we'd create the $meetingDate object here like this
    // $meetingDate = new DateTime($value->meeting_scheduled_at);

    if ($meetingDate < $now) {
        $calendar_data['past'][] = $value;
    } else if ($meetingDate >= $tomorrow) {
        $calendar_data['later'][] = $value;
    } else {
        $calendar_data['now'][] = $value;
    }
}

【讨论】:

  • 变量meeting_scheduled_at 将日期存储在时间戳中。那么,它可以与时间戳一起使用吗?
  • @phantophoenix 您可以使用@ 前缀或使用setTimestamp 方法,我会更新我的答案以反映。
  • @phantophoenix 现已更新,看到我已将 $meetingDate 的初始化移到 foreach 之外以节省内存(仅使用单个实例而不是每次会议 1 个)并仅使用 @ 987654328@方法。
  • @phantophoenix 顺便说一句,您可以使用 $meetingDate = new DateTime('@' . $value-&gt;meeting_scheduled_at); 直接从 UNIX 时间戳创建它。
  • 我正在使用 Laravel,运行代码时出现以下错误。 DateInterval::__construct(): Unknown or bad format (1d).
【解决方案3】:

让事情变得更简单

$now = time();
// Midnight due to discussion with Kevin Nagurski in comments :) 
$tommorow = strtotime('tomorrow');
foreach($data as $key => $value) 
    if ($value->meeting_scheduled_at) < $now) $calendar_data['past'][] = $value;
    elseif ($value->meeting_scheduled_at) >= $tommorow) $calendar_data['later'][] = $value;
    else $calendar_data['now'][] = $value;

【讨论】:

  • 您的$tommorow 没有考虑夏令时的变化(而且您明天拼写错误:-p)
  • @KevinNagurski 关于明天 = 是的 :) 但如果我们比较两个 taimstamps,我真的不明白这个问题
  • 好吧,如果时钟倒退一小时 strtotime(date('Y-m-d 00:00:00', $now)) + 60*60*24; 将相当于同一天晚上 11 点,如果它们向前倒退一小时,则相当于第二天凌晨 1 点。
  • 我很难理解时区和日光,但如果 strtotime(date('Y-m-d 00:00:00', $now)) 是今天,那么 +24 小时就是明天,不是吗?更改时间发生在 2:00 :)
  • 是的,除非更改日期是今天,否则凌晨 2 点(有些地方是凌晨 1 点)可能已经过去,也可能尚未过去。例如,在英国,下一次更改时间是 2015 年 10 月 25 日,届时时钟会倒退 1 小时,所以 echo date('Y-m-d H:i:s', strtotime('2015-10-25 00:00:00') + (60*60*24)); = 2015-10-25 23:00:00
【解决方案4】:

date('Y-m-d', $value-&gt;meeting_scheduled_at) 在条件中使用其结果之前应该只计算一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2021-01-27
    • 2015-05-08
    • 1970-01-01
    • 2011-06-15
    • 2018-04-20
    相关资源
    最近更新 更多