반응형
두 날짜 사이의 모든 달을 나열하는 방법
두 날짜 사이의 모든 달을 나열하려고 합니다.
예를 들어, 시작 날짜는 다음과 같습니다.2010-12-02
마지막 날짜:2012-05-06
저는 다음과 같은 것을 나열하고 싶습니다.
2010-12
2011-01
2011-02
2011-03
2011-04
.
.
.
2012-04
2012-05
이것이 제가 시도한 것이고 전혀 작동하지 않습니다.
$year_min = 2010;
$year_max = 2012;
$month_min = 12;
$month_max = 5;
for($y=$year_min; $y<=$year_max; $y++)
{
for($m=$month_min; $m<=$month_max; $m++)
{
$period[] = $y.$m;
}
}
PHP 5.3
$start = new DateTime('2010-12-02');
$start->modify('first day of this month');
$end = new DateTime('2012-05-06');
$end->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
echo $dt->format("Y-m") . "<br>\n";
}
PHP 5.4 이상
$start = (new DateTime('2010-12-02'))->modify('first day of this month');
$end = (new DateTime('2012-05-06'))->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
echo $dt->format("Y-m") . "<br>\n";
}
시작일과 종료일을 월 1일로 수정하는 부분이 중요합니다.만약 우리가 하지 않았다면, 그리고 현재 날짜가 2월의 마지막 날보다 더 높았을 것입니다. (즉, 윤년이 아닌 해에는 28일, 윤년에는 29일) 이것은 2월을 건너뛸 것입니다.
function getMonthsInRange($startDate, $endDate)
{
$months = array();
while (strtotime($startDate) <= strtotime($endDate)) {
$months[] = array(
'year' => date('Y', strtotime($startDate)),
'month' => date('m', strtotime($startDate)),
);
// Set date to 1 so that new month is returned as the month changes.
$startDate = date('01 M Y', strtotime($startDate . '+ 1 month'));
}
return $months;
}
같은 해의 두 달과 다른 해의 두 달 사이에 차이를 두어야 합니다.
$year_min = substr($row['contractStart'], 0, 4);
$year_max = substr($row['contractEnd'], 0, 4);
$month_min = substr($row['contractStart'], 5, 2);
$month_min = substr($row['contractEnd'], 5, 2);
$period = array();
try {
if ($year_min > $year_max)
throw new Exception();
else if ($year_min == $year_max)
if ($month_min > $month_max)
throw new Exception();
for ($month = $month_min; $month <= $month_max; $month++) {
$period[] = $month . '-' . $year;
}
else {
for ($month = $month_min; $month <= 12; $month++) {
$period[] = $month . '-' . $year_min;
}
for ($year = $year_min + 1; $year < $year_max; $year++) {
for ($month = $month_min; $month <= $month_max; $month++) {
$period[] = $month . '-' . $year;
}
}
for ($month = 1; $month <= $month_max; $month++) {
$period[] = $month . '-' . $year_max;
}
}
implode("<br />\r\n", $period);
}
catch (Exception $e) {
echo 'Start date occurs after end date.'
}
그것은 어려운 방법입니다.제가 추천하는 답으로 이미 주어진 빠르고 쉬운 방법이 방법은 이미 답으로 제시되어 있습니다.
서버 환경에서 DateTime을 사용할 수 없기 때문에 이것이 저의 해결책이었습니다.
$a = "2007-01-01";
$b = "2008-02-15";
$i = date("Ym", strtotime($a));
while($i <= date("Ym", strtotime($b))){
echo $i."\n";
if(substr($i, 4, 2) == "12")
$i = (date("Y", strtotime($i."01")) + 1)."01";
else
$i++;
}
사용해 보세요: http://3v4l.org/BZOmb
라라벨에서
$period = \Carbon\CarbonPeriod::create('2017-06-28', '1 month', '2019-06-01');
foreach ($period as $dt) {
echo $dt->format("Y-m") . "<br>\n";
}
2021년 10월 업데이트
사용자가 선택한 날짜가 있는 경우 해결 방법은 다음과 같습니다.
$from = date('Y-m-d', strtotime($_POST['from']));
$to = date('Y-m-d', strtotime($_POST['to']));
$counter = 1;
$max_date = strtotime($to);
$current_date = strtotime($from);
$dates = [];
$months = [];
$loop = true;
while($loop) {
if(strtotime(date('Y-m-d',$current_date)." +".$counter."days") >= $max_date) $loop = false;
else {
$current_date = strtotime(date('Y-m-d', $current_date)." +".$counter."days");
$date = date('Y-m-d', $current_date);
$dates[] = $date;
$months[] = date('Y-m', $current_date);
$counter++;
}
}
$months = array_unique($months);
echo '<pre>';
print_r($dates);
echo '<br>';
print_r($months);
echo '</pre>';
언급URL : https://stackoverflow.com/questions/18742998/how-to-list-all-months-between-two-dates
반응형
'IT' 카테고리의 다른 글
컴파일러에 'System' 유형이 필요했기 때문에 'dynamic'을 사용하는 클래스 또는 멤버를 정의할 수 없습니다.런타임.컴파일러 서비스.동적 속성' (0) | 2023.08.16 |
---|---|
Python - 목록을 함수 매개 변수로 사용 (0) | 2023.08.16 |
Sun JSTL taglib 선언이 실패하고 "태그 라이브러리 설명자를 찾을 수 없습니다"가 표시됨 (0) | 2023.08.16 |
.git 속성 파일에서 text=auto의 목적은 무엇입니까? (0) | 2023.08.16 |
새 jQuery AJAX 코드에 성공 및 오류 대신 .done() 및 .fail()을 사용해야 합니까? (0) | 2023.08.16 |