繁体   English   中英

两个日期范围返回

[英]Two date range return

如何返回两个日期组合字符串,如下所示。

Start Date : 11/2/2020
End Date : 26/2/2020

然后输出应该是这样的:2020 年 2 月 11 日至 26 日

Start Date : 26/2/2020
End Date : 5/3/2020

那么输出应该是这样的:2020年2月26日至3月5日

Start Date : 29/12/2020
End Date : 2/1/2021

那么输出应该是这样的:2020年12月29日至2021年1月2日

请帮我解决这个问题。

欢迎使用 stackoverflow :-)

PHP 有一个原生的DateTime类,它允许您执行日期操作和日期格式化。

在您的特定情况下,您可以开始将两个日期转换为对象,然后将其重新格式化为您期望的格式。

下面是一个例子:

$date = DateTime::createFromFormat('d/m/Y', $startString);

考虑到这一点,我们现在可以创建一个函数来检查您的要求并以您的自定义格式返回字符串。

function my_date_range(DateTime $start, DateTime $end)
{
    $sameYear = $start->format('Y') === $end->format('Y');
    $sameMonth = $sameYear && $start->format('m') === $end->format('m');
    $sameDay = $sameMonth && $start->format('d') === $end->format('d');

    if ($sameDay) {
        return $start->format('d M Y');
    }
    if ($sameMonth) {
        return sprintf('%s to %s', $start->format('d'), $end->format('d M Y'));
    }
    if ($sameYear) {
        return sprintf('%s to %s', $start->format('d M'), $end->format('d M Y'));
    }

    return sprintf("%s to %s", $start->format('d M Y'), $end->format('d M Y'));
}

您会在下面找到我的示例日期和用法:

var_dump(
    my_date_range(DateTime::createFromFormat('d/m/Y', '11/2/2020'), DateTime::createFromFormat('d/m/Y', '26/2/2020')),
    my_date_range(DateTime::createFromFormat('d/m/Y', '26/2/2020'), DateTime::createFromFormat('d/m/Y', '5/3/2020')),
    my_date_range(DateTime::createFromFormat('d/m/Y', '29/12/2020'), DateTime::createFromFormat('d/m/Y', '2/1/2021')),
    my_date_range(DateTime::createFromFormat('d/m/Y', '2/1/2021'), DateTime::createFromFormat('d/m/Y', '2/1/2021')),
)

结果:

string(17) "11 to 26 Feb 2020"
string(21) "26 Feb to 05 Mar 2020"
string(26) "29 Dec 2020 to 02 Jan 2021"
string(11) "02 Jan 2021"

一种方法:

  • 将您的日期部分放入数组 - ['11', 'Feb', '2020']

  • 以相反的顺序循环它们,从一年到一天

  • 取消设置开始日期数组中的每个条目,该条目与结束日期数组中的相应条目具有相同的值 - 只要当前部分匹配; 一旦发生第一个不匹配就跳出循环

  • 将剩下的部分连接在一起

function time_range_format($start, $end) {
  for($i=2; $i>=0; --$i) {
    if($end[$i] == $start[$i]) {
      unset($start[$i]);
    }
    else {
      break; // important to leave the loop, once the first non-matching part is encountered
    }
  }
  return ($start ? implode(' ', $start) . ' to ' : '') . implode(' ', $end);
}

var_dump(
  time_range_format(['11', 'Feb', '2020'], ['26', 'Feb', '2020']),
  time_range_format(['26', 'Feb', '2020'], ['5', 'Mar', '2020']),
  time_range_format(['29', 'Dec', '2020'], ['2', 'Jan', '2021']),
  time_range_format(['29', 'Dec', '2020'], ['29', 'Dec', '2020'])
);

以上示例的结果:

11 to 26 Feb 2020
26 Feb to 5 Mar 2020
29 Dec 2020 to 2 Jan 2021
29 Dec 2020

通过检查 $start 在末尾是否仍然包含任何内容,并且仅在包含时才输出to ,您甚至可以处理开始日期和结束日期相同的“边缘情况”,如本示例的最后一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM