settings = $settings ?? Config::general(); } /** * @param DateTime $start * @param DateTime $end * @return string */ public function generate(DateTime $start, DateTime $end): string { // Equivalent Dates if ($start->format('YmdHi') === $end->format('YmdHi')) { return $start->format($this->settings->datetimeFormat()); } // Range Formats $range_formats = $this->settings->rangeFormat(); // Same Hour if ($start->format('YmdH') === $end->format('YmdH')) { $range = $range_formats['hour'] ?? 'F1 j1, G1:i1 - i2'; } // Same Day else if ($start->format('Ymd') === $end->format('Ymd')) { $range = $range_formats['day'] ?? 'F1 j1, G1:i1 - G2:i2'; } // Same Calendar Month else if ($start->format('Ym') === $end->format('Ym')) { $range = $range_formats['month'] ?? 'F1 j1 - j2, G1:i1 - G2:i2'; } // Same Calendar Year else if ($start->format('Y') === $end->format('Y')) { $range = $range_formats['year'] ?? 'F1 j1 - F2 j2, G1:i1 - G2:i2'; } // General Case (spans calendar years) else { $range = $range_formats['other'] ?? 'F1 j1, Y1 G1:i1 - F2 j2, Y2 G2:i2'; } foreach ([1 => $start, 2 => $end] as $key => $date) { foreach ([ 'Y', 'y', 'X', 'x', 'L', 'o', // Year 'M', 'm', 'F', 'n', 't', // Month 'W', // Week 'd', 'D', 'j', 'l', 'N', 'S', 'w', 'z', // Day 'a', 'A', 'B', 'g', 'G', 'h', 'H', 'i', 's', // Time 'e', 'I', 'O', 'P', 'p', 'T', 'Z', // TimeZone ] as $f) { $range = str_replace($f . $key, $date->format($f), $range); } } return $range; } }