Php 两个日期范围返回

Php 两个日期范围返回,php,wordpress,date,Php,Wordpress,Date,如何返回两个日期组合字符串,如下所示 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日 请帮助我解决此问题。欢

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

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有一个本机类,允许您执行日期操作和日期格式化

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

以下是一个例子:

$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','2','2020']

一年一天,以相反的顺序在上面循环

取消设置开始日期数组中的每个条目,只要当前部分匹配,该条目的值就与结束日期数组中的对应条目的值相同;一旦出现第一次不匹配,就中断循环

将左侧的零件重新连接在一起

上述示例的结果:

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

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

欢迎使用堆栈溢出。这是个好问题。到目前为止,您尝试了什么?@KIKOSoftware抱歉,我无法思考这种逻辑。您需要分别查看日期的三个组成部分-日、月和年。如果年份相同,则只需输出一次,否则,每个输出值都需要是完整的日期。如果年份相同,则对月份执行相同的检查,并输出相应的部分。以下是您的答案:如果您是英国人,则在答案中使用第一个解决方案,如果不是英国人,则使用第二个解决方案。这并不意味着省略两个日期相同的“重复”部分。这里的第一个例子是2020年2月11日到2020年2月26日,这不是我们要的。@CBroe哦,哇。谢谢你的提示。你完全正确。我将采纳我的答复:-
11 to 26 Feb 2020
26 Feb to 5 Mar 2020
29 Dec 2020 to 2 Jan 2021
29 Dec 2020