Il a été décidé de mettre en œuvre une spécification qui affiche à la fois le calendrier occidental et le calendrier japonais, comme "Calendrier occidental (année Heisei XX)" dans SelectBox.
Conversion du calendrier japonais en calendrier occidental et du calendrier occidental en calendrier japonais avec Java https://qiita.com/u-chida/items/31b3415a52f0e1818ab2
Vous pouvez obtenir le calendrier japonais avec ceci
Citer
//Obtenir une instance de calendrier en spécifiant les paramètres régionaux
Locale locale = new Locale("ja", "JP", "JP");
Calendar calendar = Calendar.getInstance(locale);
//calendar.getTime()Obtenez la date et l'heure actuelles et formatez-les dans le calendrier japonais
DateFormat japaseseFormat = new SimpleDateFormat("GGGGy année M mois j jour", locale);
String dateStr = japaseseFormat.format(calendar.getTime());
System.out.println("Calendrier japonais:" + dateStr);
//Analyser la date et l'heure actuelles formatées dans le calendrier japonais en calendrier occidental
//SetLenient pour vérifier la validité de la date()Passer false à
calendar.setLenient(false);
Date date = japaseseFormat.parse(dateStr);
System.out.println("UN D:" + date);
J'ai donc décidé de l'écrire avec le calendrier japonais de 1990 à 2000.
for (int seireki = 1990 ; seireki <= 2000; seireki++ ){
//Obtenir une instance de calendrier en spécifiant les paramètres régionaux
Locale locale = new Locale("ja", "JP", "JP");
Calendar calendar = Calendar.getInstance(locale);
//Effacer la valeur
calendar.clear();
//Définir l'année
calendar.set(Calendar.YEAR, seireki);
// calendar.getTime()Obtenez la date et l'heure actuelles et formatez-les dans le calendrier japonais
DateFormat japaseseFormat = new SimpleDateFormat("(Année GGGGy)", locale);
String dateStr = japaseseFormat.format(calendar.getTime());
System.out.println(seireki + dateStr);
}
résultat
1990(1990)
1991(1991)
1992(1992)
1993(1993)
1994(1994)
1995(1995)
1996(1996)
1997(1997)
1998(1998)
1999(1999)
2000(2000)
Ce n'est pas cool.
Quand j'ai regardé le contenu avec calendar.getTimeInMillis ()
, il contenait une valeur désastreuse telle que "633798000000".
Étant donné que la langue du calendrier est le calendrier japonais, si 1990 est entré dans l'année, ce sera 1990. C'est une évidence.
Malheureusement, Java 6 n'a pas de constructeur qui spécifie les paramètres régionaux et l'année en même temps.
Plan d'amélioration
for (int seireki = 1990 ; seireki <= 2000; seireki++ ){
//Obtenir une instance de calendrier en spécifiant les paramètres régionaux
Locale locale = new Locale("ja", "JP", "JP");
//Faire un calendrier 1990
Calendar greCal = new GregorianCalendar(seireki, 1, 1);
Calendar calendar = Calendar.getInstance(locale);
//Effacer la valeur
calendar.clear();
//Définir l'année à partir du calendrier
calendar.setTimeInMillis(greCal.getTimeInMillis());
// calendar.getTime()Obtenez la date et l'heure actuelles et formatez-les dans le calendrier japonais
DateFormat japaseseFormat = new SimpleDateFormat("(Année GGGGy)", locale);
String dateStr = japaseseFormat.format(calendar.getTime());
System.out.println(seireki + dateStr);
}
1990(1990)
1991(1991)
1992(1992)
1993(1993)
1994(1994)
1995(1995)
1996(1996)
1997(1997)
1998(1998)
1999(1999)
2000(2000)
Bonnes vibrations. La frontière entre Heisei et Showa est parfaite (né en 1989 est traité uniformément en 1991)
1987(1987)
1988(1988)
1989(1991)
1990(1990)
Une année devrait-elle vraiment être la première ...? J'ai pu bien le faire pour le moment, mais je me demande si tout va vraiment bien.
PostScript 2017/11/17 Ce qui précède a été fait dans Java 6, mais corrigé dans Java 8. En réponse au commentaire, l'affichage a été changé en "1989 est Showa et Heisei".
import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
public class Qiita21ee9377032b650c2de6 {
public static void main(String[] args) {
QiitaExecute qiitaExe = new QiitaExecute();
qiitaExe.execute();
}
}
class QiitaExecute {
private final DateTimeFormatter japaseseFormat = DateTimeFormatter.ofPattern("Année GGGGy");
/**
*Courir
*/
public void execute() {
for (int annoDomini = 1987; annoDomini <= 1990; annoDomini++) {
String eraString = getEraString(annoDomini);
System.out.println(annoDomini + "(" + eraString + ")");
}
}
/**
*Retour du calendrier japonais
*Passez l'année et revenez s'il y a un changement de yuan entre le premier jour et la fin de l'année, concaténez les deux yuans avec "・"
*S'il n'y a pas de changement dans le yuan, retournez le yuan le premier jour
* @param annoDomini
* @return
*/
private String getEraString(int annoDomini) {
//Le jour de l'An
//(Le mois de la date japonaise est affiché de 1 à 12)
JapaneseDate japaneseNewYearDate = JapaneseDate.of(annoDomini, 1, 1);
//Fin de l'année
JapaneseDate japaneseNewYearEveDate = JapaneseDate.of(annoDomini, 12, 31);
//Si le yuan est le même, le yuan du yuan est retourné, sinon le yuan et la fin de l'année sont liés à «・» et retournés.
if (japaneseNewYearDate.getEra().getValue() == japaneseNewYearEveDate.getEra().getValue()) {
return japaseseFormat.format(japaneseNewYearDate);
} else {
return japaseseFormat.format(japaneseNewYearDate) + "・" + japaseseFormat.format(japaneseNewYearEveDate);
}
}
}
résultat
1987(1987)
1988(1988)
1989(1988/2001)
1990(1990)
Il est préoccupant de savoir s'il faut afficher en 1989 (Showa 64, 1989). Je suis japonais, donc je veux être en première année.
1987(1987)
1988(1988)
1989(1988)
1989(1991)
1990(1990)
Peut être le bon affichage, mais il peut être déroutant d'être né en 1989 ou 1990. (Je pense qu'il est né en 1990 sous 1989. Compte tenu de la possibilité d'erreurs comme celles qui sélectionnent la case de sélection avec le clavier)