两个日期之间的时间 测试用例

问题描述

我想计算两个日期之间的时间,以分钟为单位,同时,其中仅包括08:00:0016:30:00间的时间,还不包括周六和周日。我该如何实现?以下是我的代码,它通常只计算两个日期之间的时间。

foreach($result as $row)
{
    $sub_array = array();
    $sub_array[] = floor((strtotime($row['app_2_date'])-strtotime($row['app_1_date']))/(60));
    $data[] = $sub_array;
}

我尝试了以下代码,但仍然无法正常工作

foreach($result as $row)
{
    if
        (
            date('H:i:s',strtotime($row['app_2_date'])) > date('H:i:s',strtotime('1970-01-01 16:30:00'))||
            date('H:i:s',strtotime($row['app_2_date'])) < date('H:i:s',strtotime('1970-01-01 08:00:00'))
        )
    {
        $sub_array[] = floor((strtotime($row['app_3_date'])-strtotime($row['app_2_date']))/(60))-(15.5*60);
    }
    else
    {
        $sub_array[] = floor((strtotime($row['app_3_date'])-strtotime($row['app_2_date']))/(60));
    }
}

解决方法

add_action('init','add_gng_offer');

function add_gng_offer() {
    $labels = array(
        'name' => 'GnG Offer','singular_name' => 'GnG Offer','add_new' => 'Add New Offer','add_new_item' => 'Add new Offer','edit_item' => 'Edit Offer','new_item' => 'Add New Offer','view_items' => 'View Offers','search_items' => 'Search Offers','not_found' => 'No Offers Found','not_found_trash' => 'No Offers Found In Trash',);

    $supports = array(
        'title','editor','thumbnail','comments','revisions'
    );

    $args = array(
        'labels' => $labels,'supports' => $supports,'public' => true,'capablity_type' => 'post','rewrite' => array('slug' => 'GnG Offers'),'has_archive' => true,'menu_position' => 6,'menu_icon' => 'dashicons-calendar-alt','register_meta_box' => '',);

    register_post_type('GnG Offers',$args);
}

//Creating meta Boxes for Custom Post Type

function product_id_meta_box () {
    add_meta_box(
        'product_id','Product Field','product_function_callback','GnG Offer','side','default'
    );
}

add_action('add_meta_boxes','product_id_meta_box');

fiddle

,

这是一种面向对象的方法。我使用的是PHP 7.4.9版。

我假设您拥有Composer带给PHP项目的力量。

我已经使用Carbon库创建了这个示例,以扩展默认的DateTime API。

use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Carbon\CarbonInterval;

$start = Carbon::now();
$end = $start->copy()->addMonth();

$days = new CarbonPeriod($start,$end);
$workDays = [];

foreach ($days as $day) {
    if (! $day->isWeekend()) {
        $dayStart = $day->isSameDay($start) ?
            $start : $day->copy()->setTime(8,00);
    
        $dayEnd = $day->isSameDay($end) ?
            $end : $day->copy()->setTime(16,30);

        $workDays[] = new CarbonPeriod(
            $dayStart,$dayEnd,CarbonInterval::minute()
        );
    }
}
$minutes = 0;

foreach ($workDays as $workDay) {
   $minutes += iterator_count($workDay);
}
var_dump($minutes) // int(11242)

请注意,我没有仔细检查结果。

测试用例

为了快速测试此方法,您可以使用interactive PHP shell like PsySH

在这种情况下,我假设:

  • 您正在使用类似UNIX的系统。
  • PHP已安装并在您的CLI中可用。
  • GIT已安装并在您的CLI中可用。
  • 未安装/不提供Composer。
git clone [email protected]:briannesbitt/Carbon.git carbon
cd carbon
php -r "copy('https://getcomposer.org/download/1.10.13/composer.phar','composer');"
chmod u+x composer
./composer install
./composer require psy/psysh
./vendor/bin/psysh

PsySH正在运行,您就可以进入。现在将PHP代码示例复制到剪贴板中,然后粘贴到PsySH shell中。