【问题标题】:PHP Dates getting a start date and end date for each periodPHP Dates 获取每个期间的开始日期和结束日期
【发布时间】:2016-02-16 15:04:13
【问题描述】:

好的,我正在尝试从一个日期开始生成计费周期的结束;我的问题是,如果我有一个变量 $billing_period = 02/28/2016 并且每个月的每个 14th28th 都有计费周期。根据开始日期,当他们有不同的日期时,如何从这个变量生成期间的结束日期?

让我感到困惑的是,如果日期是 28th,那么除了 14th 之外,它还有 1516days,这是下一个计费周期的开始。如果日期是14th,那么它与28th 相差14 天。感谢您的帮助

编辑 - 此处的图像显示了选择的日期,即 02/14/2016 我如何从开始日期回显下一个计费日期,即 02/28/2016

这是我的数组代码并获取开始日期。

<?
    $date = array('16-01-14','16-01-28','16-02-14','16-02-28','16-03-14','16-03-28','16-04-14','16-04-28',
'16-05-14','16-05-28','16-06-14','16-06-28','16-07-14','16-07-28','16-08-14','16-08-28','16-09-14','16-09-28','16-10-14','16-10-28',
'16-11-14','16-11-28','16-12-14','16-12-28');
    $currentdate = date('y-m-d');
 foreach ($date as $i => $d) {
    if ($currentdate >= $d && ($i == count($date)-1 || $currentdate < $date[$i+1])) {
        $selected = "selected";
        $selected_int = $i;
    } else {
        $selected = "";
    }
    list($year, $month, $day) = explode('-', $d);
    echo "<option $selected>" . date("m/d/Y", strtotime($d)) . "</option>";
 }
    ?>

【问题讨论】:

  • 我不确定我是否理解你的问题,但听起来你可以使用php.net/manual/en/function.date-diff.php
  • @Popnoodles 上面显示的几乎所有日期都相差天数,所以我应该关注间隔天数。如果它像 14th 的 if 语句和 28th 的 if 语句一样简单,我会这样做,但事实并非如此。
  • 它看起来确实是这样,而且你无缘无故地让它变得复杂。还是您的问题是“我如何计算两个日期之间的天数?”
  • @LewisTyler 如果您在问题中添加一些代码可能会有所帮助。您已经拥有选择中显示的所有账单日期。据我了解,您需要做的就是获取所选日期的日期,并以天为单位获取差异
  • (现在有代码)。好的,所以你有一个清单。当然在if ($currentdate...){ 里面,这会让你像这样$nextdate = $date[$i + 1];

标签: php date


【解决方案1】:

希望我理解得很好。

您要做的是根据您之前选择的日期确定您的计费周期。

所以,您选择一个日期 ($date)。

那么你需要知道选择的日期

$timestamp = strtotime($date);
$day = date('D', $timestamp);

现在您可以进行比较了。

$datetime = new DateTime($date);
if ($day == 14 ){ // if you select 14th then your billing is on the 28th 
    $billing = $datetime->modify($date->format('Y-m-28'));
}else{ // if you didn't select 14th, then you select 28, and you add one month and set the day in 14th.
    $next_month = $datetime->modify('+1 month');
    $billing = $next_month->modify($date->format('Y-m-14'));
}

【讨论】:

  • 这也是我认为的问题,尽管刘易斯说它不是......
  • 不错的答案 jpganz18 正是我想要的谢谢。
  • 我忘记删除 if 子句中的 &&,请确保您看到更新
【解决方案2】:

使用账单日期构建一个数组,获取当前键并将其递增以获取下一个值。带字符串的简单示例:

$dates    = ['02/28/2016', '03/14/2016', '03/28/2016', ...];
$key      = array_search( '03/14/2016', $dates );
$nextDate = $dates[$key + 1]; // 03/28/2016

这是你想要的吗?

【讨论】:

  • 谢谢你的回答;如果您可以将其应用于上面的示例,我会毫不犹豫地将其标记为答案 :) 谢谢您的帮助
  • 您可以轻松地使用等于$key 变量的$selected_int。使用$date[$selected_int + 1] 获取下一个日期就完成了
【解决方案3】:

这里是让你下次约会的代码,以防万一你想一次性完成。

$date = new DateTime();

$next = $date->format('14/m/Y');
if ($date->format('d') >= 14 && $date->format('d') < 28) {
    $next = $date->format('28/m/Y');
}

if ($date->format('d') >= 28) {
    $date->modify('+1 month');
    $next = $date->format('14/m/Y');
}

echo $next;

这里的代码变成了你可以在需要时调用的函数,它会返回一个DateTime() 对象,这样你就可以以你当时需要的任何格式输出日期,或者执行进一步的比较/修改应该你需要下线。

function nextBillingDate($date, $format = 'd/m/Y') {
    $date = DateTime::createFromFormat($format, $date);
    $next = $date->format('14/m/Y');
    if ($date->format('d') >= 14 && $date->format('d') <= 28) {
        $next = $date->format('28/m/Y');
    }

    if ($date->format('d') >= 28) {
        $date->modify('+1 month');
        $next = $date->format('14/m/Y');
    }

    return DateTime::createFromFormat('d/m/Y', $next);
}

使用示例:

$date = nextBillingDate('28/02/2016');
echo $date->format('d/m/Y');

输出:

14/03/2016

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多