[JAVA] Traitement des dates invalides (comme le 31 février) dans chaque langue

J'ai résumé comment gérer les dates invalides telles que le 31 février dans chaque langue. 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

En PHP strtotime (), un mois après le 31/01/2017, il devient "31/02/2017". "2017-02-31" est interprété comme "2017-03-03".

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);
    
    //Augmenter le mois de 1
    date.setMonth(date.getMonth() + 1);
}

2017-1-31
2017-3-3
2017-4-3
2017-5-3
2017-6-3
2017-7-3

Dans le cas de la classe Date de JavaScript, comme avec PHP, un mois après le 31/01/2017, ce sera "31/02/2017". "2017-02-31" est interprété comme "2017-03-03". Puisque setMonth () est une méthode destructive, elle restera pendant 3 jours après le 2017-3-3.

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);
        
        //Définir le format d'affichage
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
    
        //Augmenter le mois de 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

Dans le cas de la classe Calendar de Java, si le mois augmenté ne comporte que 28 jours, le jour sera également changé en 28. Même s'il reste un mois avant le 31 après cela, le jour reste le 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

La classe Ruby's Date affiche le dernier jour à merveille.

Recommended Posts

Traitement des dates invalides (comme le 31 février) dans chaque langue
Convivialité de la classe de date et d'heure dans chaque langue