簡體   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