[JAVA] Phrase en boucle avec des calendriers occidentaux et japonais [Faire une notation comme 1990 (1990)]

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)

Recommended Posts

Phrase en boucle avec des calendriers occidentaux et japonais [Faire une notation comme 1990 (1990)]
[LINE @] J'ai essayé de créer un BOT de conversion de calendrier occidental de calendrier japonais [API de messagerie]