【问题标题】:Pick day or date that comes first选择最先出现的日期或日期
【发布时间】:2018-01-03 21:16:13
【问题描述】:

我正在尝试选择周五/周六或 3 日、18 日、30 日、31 日……以先到者为准。

实例:当前日期为 2017 年 1 月 10 日,星期二。

选项:

  1. 2017 年 1 月 13 日,星期五
  2. 2017 年 1 月 18 日,星期三

我的代码应该选择 2017 年 1 月 13 日星期五。

PHP

$dayOfWeekArray  = ['friday', 'saturday'];
$dayOfMonthArray = [3, 18, 30, 31];

foreach ($dayOfWeekArray as $dayOfWeek) {
    $nextDayDate = new DateTime("next $dayOfWeek");

    foreach ($dayOfMonthArray as $dayOfMonth) {
        # Continue if $nextDayDate is before, or equals, whichever date $dayOfMonth turns out to be.

        # Otherwise, determine which comes first, $nextDayDate or $dayOfMonth
    }
}

问题:如何将$dayOfMonth 变成约会对象?

【问题讨论】:

    标签: php datetime


    【解决方案1】:

    我会使用 DatePeriod 以 1 天为间隔循环几天,直到格式化的日期与您正在寻找的值之一匹配 -

    $start = new \DateTime("2017-01-10");
    
    // You can probably do some math to determine the minimum number needed here
    
    // php version 7.1.5 
    // $end = (clone $start)->modify("+31 days");
    
    // php version 5.6
    $end = clone $start;
    $end->modify("+31 days");
    
    $interval = new \DateInterval("P1D"); // An interval of 1 day
    $period = new \DatePeriod($start, $interval, $end);
    
    foreach ($period as $date) {
        if (in_array($date->format('l'), ['Friday', 'Saturday']) || in_array((int) $date->format('d'), [3, 18, 30, 31])) {
            break;
        }
    }
    
    echo $date->format('l, Y-m-d') ;
    
    // outputs 'Friday, 2017-01-13'
    

    如果当前日期已经是 2017 年 1 月 13 日,我想您是在问最后日期不是 2017 年 1 月 13 日——在这种情况下,您可以在开始日中添加一天,例如 $start = (new \DateTime("today"))->modify("+1 day")

    【讨论】:

    • 对不起,我没有指定这部分但是,如果当前日期是2017-01-13,代码应该选择星期六
    • 实际上,我认为您确实指定了它,但我最初错过了第二个循环中限定的“或等于”部分 - 请参阅我的最后一次编辑。只需在开始日期上增加一天即可。
    • 嗯,我会搞砸的,但在foreach 之前它会中断(空白页)。
    • 尝试 $end = clone $start; $end->modify("+31 days"); 而不是 $end = (clone $start)->modify("+31 days"); 后者适用于我的 7.1,但只有前者适用于我的 5.6。来自文档:“PHP 7.0.0 引入了在单个表达式中访问新克隆对象的成员的可能性。”
    • 这有效:$end = clone $start; $end->modify("+31 days");
    【解决方案2】:

    假设您想知道当前月份和年份的 dayOfMonth,您可以使用 DateTime 的 createFromFormat 函数 (http://php.net/manual/en/datetime.createfromformat.php) 例如

    $dayOfWeekArray  = ['friday', 'saturday'];
    $dayOfMonthArray = [3, 18, 30, 31];
    $currentDate = new DateTime('now');
    
    foreach ($dayOfWeekArray as $dayOfWeek) {
      ...
    
      foreach ($dayOfMonthArray as $dayOfMonth) {
        $nextDayOfMonthDateString = $dayOfMonth.'-'.$currentDate->format('m-Y');
        $nextDayOfMonthDate = DateTime::createFromFormat('d-m-Y', $nextDayOfMonthDateString);
        ...
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2011-09-30
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多