Ich habe zusammengefasst, wie mit ungültigen Daten wie dem 31. Februar in jeder Sprache umgegangen werden soll. PHP
<?php
$target_date = "2017-01-31";
for ($i=0; $i < 6; $i++) {
echo date('Y-m-d', strtotime($target_date . '+' . $i . ' month')) . "\n";
}
?>
2017-01-31
2017-03-03
2017-03-31
2017-05-01
2017-05-31
2017-07-01
In PHP strtotime () wird es einen Monat nach dem 31.01.2017 "2017-02-31". "2017-02-31" wird als "2017-03-03" interpretiert.
JavaScript
var date = new Date(2017 ,1 - 1, 31);
for (var i=0; i < 6; i++) {
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
console.log(year + '-' + month + '-' + day);
//Erhöhen Sie den Monat um 1
date.setMonth(date.getMonth() + 1);
}
2017-1-31
2017-3-3
2017-4-3
2017-5-3
2017-6-3
2017-7-3
Bei der Date-Klasse von JavaScript wie bei PHP ist es einen Monat nach dem 31.01.2017 "2017-02-31". "2017-02-31" wird als "2017-03-03" interpretiert. Da setMonth () eine destruktive Methode ist, bleibt sie nach dem 03.03.2017 3 Tage lang bestehen.
Java
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class Main {
public static void main(String[] args) throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.set(2017, 1 - 1, 31);
//Stellen Sie das Anzeigeformat ein
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
//Erhöhen Sie den Monat um 1
for (int i = 0 ; i < 6 ; i++){
System.out.println(sdf1.format(calendar.getTime()));
calendar.add(Calendar.MONTH, 1);
}
}
}
2017-01-31
2017-02-28
2017-03-28
2017-04-28
2017-05-28
2017-06-28
Wenn in der Kalenderklasse von Java der erhöhte Monat nur 28 Tage hat, wird der Tag ebenfalls in 28 geändert. Selbst wenn es einen Monat bis zum 31. danach gibt, bleibt der Tag der 28 ..
Ruby
require "date"
date = Date.new(2017, 1 ,31)
for i in 0..5
puts((date >> i).strftime("%Y-%m-%d"))
end
2017-01-31
2017-02-28
2017-03-31
2017-04-30
2017-05-31
2017-06-30
Rubys Date-Klasse gibt den letzten Tag wunderschön aus.