Câu trả lời:
Yêu cầu PHP5.3:
$begin = new DateTime('2010-05-01');
$end = new DateTime('2010-05-10');
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);
foreach ($period as $dt) {
echo $dt->format("l Y-m-d H:i:s\n");
}
Điều này sẽ xuất ra tất cả các ngày trong khoảng thời gian xác định giữa $start
và $end
. Nếu bạn muốn bao gồm số 10, hãy đặt $end
thành thứ 11. Bạn có thể điều chỉnh định dạng theo ý thích của bạn. Xem Hướng dẫn PHP cho DatePeriod .
$begin->setTime(0,0); $end->setTime(12,0);
hoặc khởi tạo với thời gian trong ngày của ngày bắt đầu vì bất kỳ lúc nào muộn hơn ngày kết thúc sẽ bao gồm ngày kết thúc trong vòng lặp. Không phải là bản sửa lỗi thời trang nhất, nhưng đó là lựa chọn tốt nhất miễn là không có cờ thích hợp.
Điều này cũng bao gồm ngày cuối cùng
$begin = new DateTime( "2015-07-03" );
$end = new DateTime( "2015-07-09" );
for($i = $begin; $i <= $end; $i->modify('+1 day')){
echo $i->format("Y-m-d");
}
Nếu bạn không cần ngày cuối cùng chỉ cần loại bỏ =
khỏi điều kiện.
$begin
sẽ khác nhau sau vòng lặp. Vòng lặp này sửa đổi đối tượng được tạo bởi new DateTime( "2015-07-03" )
. Do đó, tại sao bạn nên sử dụng các phiên bản DateTimeImmutable. Nhưng bạn cần một số sửa đổi thêm cho việc sử dụng chúng.
Chuyển đổi sang dấu thời gian unix làm cho việc thực hiện toán ngày trở nên dễ dàng hơn trong php:
$startTime = strtotime( '2010-05-01 12:00' );
$endTime = strtotime( '2010-05-10 12:00' );
// Loop between timestamps, 24 hours at a time
for ( $i = $startTime; $i <= $endTime; $i = $i + 86400 ) {
$thisDate = date( 'Y-m-d', $i ); // 2010-05-01, 2010-05-02, etc
}
Khi sử dụng PHP với múi giờ có DST, hãy đảm bảo thêm thời gian không phải là 23:00, 00:00 hoặc 1:00 để bảo vệ trước những ngày bỏ qua hoặc lặp lại.
Sao chép từ mẫu php.net cho phạm vi bao gồm :
$begin = new DateTime( '2012-08-01' );
$end = new DateTime( '2012-08-31' );
$end = $end->modify( '+1 day' );
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $date){
echo $date->format("Ymd") . "<br>";
}
$startTime = strtotime('2010-05-01');
$endTime = strtotime('2010-05-10');
// Loop between timestamps, 1 day at a time
$i = 1;
do {
$newTime = strtotime('+'.$i++.' days',$startTime);
echo $newTime;
} while ($newTime < $endTime);
hoặc là
$startTime = strtotime('2010-05-01');
$endTime = strtotime('2010-05-10');
// Loop between timestamps, 1 day at a time
do {
$startTime = strtotime('+1 day',$startTime);
echo $startTime;
} while ($startTime < $endTime);
Đây là một đơn giản -
/**
* Date range
*
* @param $first
* @param $last
* @param string $step
* @param string $format
* @return array
*/
function dateRange( $first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
$dates = [];
$current = strtotime( $first );
$last = strtotime( $last );
while( $current <= $last ) {
$dates[] = date( $format, $current );
$current = strtotime( $step, $current );
}
return $dates;
}
Thí dụ:
print_r( dateRange( '2010-07-26', '2010-08-05') );
Array (
[0] => 2010-07-26
[1] => 2010-07-27
[2] => 2010-07-28
[3] => 2010-07-29
[4] => 2010-07-30
[5] => 2010-07-31
[6] => 2010-08-01
[7] => 2010-08-02
[8] => 2010-08-03
[9] => 2010-08-04
[10] => 2010-08-05
)
Sử dụng chức năng này: -
function dateRange($first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
$dates = array();
$current = strtotime($first);
$last = strtotime($last);
while( $current <= $last ) {
$dates[] = date($format, $current);
$current = strtotime($step, $current);
}
return $dates;
}
Cách sử dụng / chức năng gọi: -
Tăng thêm một ngày: -
dateRange($start, $end); //increment is set to 1 day.
Tăng theo tháng: -
dateRange($start, $end, "+1 month");//increase by one month
sử dụng tham số thứ ba nếu bạn muốn đặt định dạng ngày: -
dateRange($start, $end, "+1 month", "Y-m-d H:i:s");//increase by one month and format is mysql datetime
đây là một cách:
$date = new Carbon();
$dtStart = $date->startOfMonth();
$dtEnd = $dtStart->copy()->endOfMonth();
$weekendsInMoth = [];
while ($dtStart->diffInDays($dtEnd)) {
if($dtStart->isWeekend()) {
$weekendsInMoth[] = $dtStart->copy();
}
$dtStart->addDay();
}
Kết quả của $ cuối tuầnInMoth là một loạt các ngày cuối tuần!
$date = new DateTime($_POST['date']);
$endDate = date_add(new DateTime($_POST['date']),date_interval_create_from_date_string("7 days"));
while ($date <= $endDate) {
print date_format($date,'d-m-Y')." AND END DATE IS : ".date_format($endDate,'d-m-Y')."\n";
date_add($date,date_interval_create_from_date_string("1 days"));
}
Bạn cũng có thể lặp lại như thế này, Có $_POST['date']
thể là vết lõm từ ứng dụng hoặc trang web của $_POST['date']
bạn Thay vì bạn cũng có thể đặt chuỗi của mình ở đây "21-12-2019"
. Cả hai sẽ làm việc.
Nếu bạn sử dụng Laravel và muốn sử dụng Carbon, giải pháp chính xác sẽ là như sau:
$start_date = Carbon::createFromFormat('Y-m-d', '2020-01-01');
$end_date = Carbon::createFromFormat('Y-m-d', '2020-01-31');
$period = new CarbonPeriod($start_date, '1 day', $end_date);
foreach ($period as $dt) {
echo $dt->format("l Y-m-d H:i:s\n");
}
Nhớ thêm:
<?php
$start_date = '2015-01-01';
$end_date = '2015-06-30';
while (strtotime($start_date) <= strtotime($end_date)) {
echo "$start_daten";
$start_date = date ("Y-m-d", strtotime("+1 days", strtotime($start_date)));
}
?>