반응형
2024-11-13, 2024-11-16 일 입력하면
2024-11-13, 2024-11-14, 2024-11-15, 2024-11-16을 반환하는 함수를 입니다.
원하면 시작날짜, 종료날짜를 각각 뺄 수 있게 만들었습니다.
함수
/**
* 두 날짜 사이의 날짜들을 배열로 반환하는 함수
*
* @param string $from 시작일 (YYYY-MM-DD 형식)
* @param string $to 종료일 (YYYY-MM-DD 형식)
* @param bool $first 시작일 포함 여부 (true: 포함, false: 미포함)
* @param bool $last 종료일 포함 여부 (true: 포함, false: 미포함)
* @return array|false 성공시 날짜 배열, 실패시 false 반환
*/
function getDates($from, $to, $first = true, $last = true) {
try {
// 날짜 형식 검증
$dateFormat = 'Y-m-d';
$d = DateTime::createFromFormat($dateFormat, $from);
if (!$d || $d->format($dateFormat) !== $from) {
throw new Exception("잘못된 시작일 형식입니다. YYYY-MM-DD 형식으로 입력하세요.");
}
$d = DateTime::createFromFormat($dateFormat, $to);
if (!$d || $d->format($dateFormat) !== $to) {
throw new Exception("잘못된 종료일 형식입니다. YYYY-MM-DD 형식으로 입력하세요.");
}
$start = new DateTime($from);
$end = new DateTime($to);
// 시작일이 종료일보다 크면 에러
if ($start > $end) {
throw new Exception("Error: 시작일($from)이 종료일($to)보다 늦습니다.");
}
// 배열 생성
$dates = [];
$curr = clone $start;
// 시작일 제외시 하루 추가
if (!$first) {
$curr->modify('+1 day');
}
// 종료일 제외시 하루 감소
$endDay = clone $end;
if (!$last) {
$endDay->modify('-1 day');
}
// 날짜 배열 생성
while ($curr <= $endDay) {
$dates[] = $curr->format('Y-m-d');
$curr->modify('+1 day');
}
return $dates;
} catch (Exception $e) {
echo $e->getMessage() . "\n";
return false;
}
}
함수 사용법
// 사용 예제
echo "1. 모든 날짜 포함 (2024-11-10 ~ 2024-11-14)\n";
$dates1 = getDates('2024-11-10', '2024-11-14');
echo "<xmp>";
print_r($dates1);
echo "</xmp>";
echo "\n2. 시작일 제외\n";
$dates2 = getDates('2024-11-10', '2024-11-14', false, true);
echo "<xmp>";
print_r($dates2);
echo "</xmp>";
echo "\n3. 종료일 제외\n";
$dates3 = getDates('2024-11-10', '2024-11-14', true, false);
echo "<xmp>";
print_r($dates3);
echo "</xmp>";
echo "\n4. 시작일과 종료일 모두 제외\n";
$dates4 = getDates('2024-11-10', '2024-11-14', false, false);
echo "<xmp>";
print_r($dates4);
echo "</xmp>";
// 에러 케이스 예제
echo "\n5. 잘못된 날짜 형식 입력\n";
$dates5 = getDates('2024-13-10', '2024-11-14'); // 13월은 없으므로 에러
echo "<xmp>";
print_r($dates5);
echo "</xmp>";
echo "\n6. 시작일이 종료일보다 늦은 경우\n";
$dates6 = getDates('2024-11-15', '2024-11-14');
echo "<xmp>";
print_r($dates6);
echo "</xmp>";
출력 결과
1. 모든 날짜 포함 (2024-11-10 ~ 2024-11-14)
Array
(
[0] => 2024-11-10
[1] => 2024-11-11
[2] => 2024-11-12
[3] => 2024-11-13
[4] => 2024-11-14
)
2. 시작일 제외
Array
(
[0] => 2024-11-11
[1] => 2024-11-12
[2] => 2024-11-13
[3] => 2024-11-14
)
3. 종료일 제외
Array
(
[0] => 2024-11-10
[1] => 2024-11-11
[2] => 2024-11-12
[3] => 2024-11-13
)
4. 시작일과 종료일 모두 제외
Array
(
[0] => 2024-11-11
[1] => 2024-11-12
[2] => 2024-11-13
)
5. 잘못된 날짜 형식 입력
잘못된 시작일 형식입니다. YYYY-MM-DD 형식으로 입력하세요.
6. 시작일이 종료일보다 늦은 경우
시작일(2024-11-15)이 종료일(2024-11-14)보다 늦습니다.
반응형
'PHP' 카테고리의 다른 글
PHP 배열 함수 정리 (0) | 2024.11.21 |
---|---|
유튜브 주소에서 유튜브 영상 아이디 가져오기 (1) | 2024.11.15 |
PHP 날짜 몇분전, 몇시간전, 몇일전, 몇달전, 몇년전 지난 시간 계산 (0) | 2024.11.10 |
PHP에서 $_SERVER 변수에 대한 설명 (0) | 2024.11.09 |
100일 뒤 날짜구하기, 특정 날짜 구하기 (0) | 2023.11.19 |