[JAVA] Schleifensatz mit westlichen und japanischen Kalendern [Notation wie 1990 (1990)]

Es wurde beschlossen, eine Spezifikation zu implementieren, die sowohl den westlichen als auch den japanischen Kalender anzeigt, z. B. "Westkalender (Heisei XX Jahr)" in SelectBox.

Konvertieren Sie mit Java vom japanischen Kalender in den westlichen Kalender und vom westlichen Kalender in den japanischen Kalender https://qiita.com/u-chida/items/31b3415a52f0e1818ab2

Sie können den japanischen Kalender damit erhalten

Zitieren

//Rufen Sie die Kalenderinstanz ab, indem Sie das Gebietsschema angeben
Locale locale = new Locale("ja", "JP", "JP");
Calendar calendar = Calendar.getInstance(locale);

//calendar.getTime()Holen Sie sich das aktuelle Datum und die aktuelle Uhrzeit mit und formatieren Sie es in den japanischen Kalender
DateFormat japaseseFormat = new SimpleDateFormat("GGGGy Jahr M Monat d Tag", locale);
String dateStr = japaseseFormat.format(calendar.getTime());
System.out.println("Japanischer Kalender:" + dateStr);

//Analysieren Sie das aktuelle Datum und die aktuelle Uhrzeit, die im japanischen Kalender formatiert sind, in den westlichen Kalender
//SetLenient, um die Gültigkeit des Datums zu überprüfen()Übergeben Sie false an
calendar.setLenient(false);
Date date = japaseseFormat.parse(dateStr);
System.out.println("ANZEIGE:" + date);   

Also habe ich beschlossen, es von 1990 bis 2000 zusammen mit dem japanischen Kalender zu schreiben.

for (int seireki = 1990 ; seireki <= 2000; seireki++ ){

	//Rufen Sie die Kalenderinstanz ab, indem Sie das Gebietsschema angeben
	Locale locale = new Locale("ja", "JP", "JP");
	Calendar calendar = Calendar.getInstance(locale);
	//Wert löschen
	calendar.clear();
	//Jahr einstellen
	calendar.set(Calendar.YEAR, seireki);

	// calendar.getTime()Holen Sie sich das aktuelle Datum und die aktuelle Uhrzeit mit und formatieren Sie es in den japanischen Kalender
	DateFormat japaseseFormat = new SimpleDateFormat("(GGGGy Jahr)", locale);
	String dateStr = japaseseFormat.format(calendar.getTime());

	System.out.println(seireki + dateStr);
}

Ergebnis

1990(1990)
1991(1991)
1992(1992)
1993(1993)
1994(1994)
1995(1995)
1996(1996)
1997(1997)
1998(1998)
1999(1999)
2000(2000)

Das ist nicht cool. Als ich den Inhalt mit "calendar.getTimeInMillis ()" betrachtete, enthielt er einen katastrophalen Wert wie "633798000000".

Da das Gebietsschema des Kalenders der japanische Kalender ist, ist es 1990, wenn 1990 im Jahr eingegeben wird. Das ist selbstverständlich.

Leider verfügt Java 6 nicht über einen Konstruktor, der das Gebietsschema und das Jahr gleichzeitig angibt.

Verbesserungsplan

for (int seireki = 1990 ; seireki <= 2000; seireki++ ){

	//Rufen Sie die Kalenderinstanz ab, indem Sie das Gebietsschema angeben
	Locale locale = new Locale("ja", "JP", "JP");
	//Machen Sie einen Kalender von 1990
	Calendar greCal = new GregorianCalendar(seireki, 1, 1);
	Calendar calendar = Calendar.getInstance(locale);
	//Wert löschen
	calendar.clear();
	//Jahr aus Kalender einstellen
	calendar.setTimeInMillis(greCal.getTimeInMillis());

	// calendar.getTime()Holen Sie sich das aktuelle Datum und die aktuelle Uhrzeit mit und formatieren Sie es in den japanischen Kalender
	DateFormat japaseseFormat = new SimpleDateFormat("(GGGGy Jahr)", 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)

Gute Stimmung. Die Grenze zwischen Heisei und Showa ist perfekt (geboren 1989 wird 1991 einheitlich behandelt)

1987(1987)
1988(1988)
1989(1991)
1990(1990)

Sollte ein Jahr wirklich das erste Jahr sein ...? Ich konnte es vorerst gut machen, aber ich frage mich, ob das wirklich in Ordnung ist.

17.11.2017 Nachtrag Das obige wurde in Java 6 durchgeführt, aber in Java 8 behoben. In Reaktion auf den Kommentar wurde die Anzeige in "1989 is Showa and Heisei" geändert.

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("GGGGy Jahr");

	/**
	 *Lauf
	 */
	public void execute() {
		for (int annoDomini = 1987; annoDomini <= 1990; annoDomini++) {
			String eraString = getEraString(annoDomini);
			System.out.println(annoDomini + "(" + eraString + ")");
		}
	}

	/**
	 *Rückgabe des japanischen Kalenders
	 *Übergeben Sie das Jahr und kehren Sie zurück, wenn sich der Yuan zwischen dem ersten Tag und dem Jahresende ändert. Verketten Sie beide Yuan mit "・".
	 *Wenn sich der Yuan nicht ändert, geben Sie den Yuan am ersten Tag zurück
	 * @param annoDomini
	 * @return
	 */
	private String getEraString(int annoDomini) {

		//Neujahr
		//(Der Monat des japanischen Datums wird von 1 bis 12 angezeigt.)
		JapaneseDate japaneseNewYearDate = JapaneseDate.of(annoDomini, 1, 1);
		//Jahresende
		JapaneseDate japaneseNewYearEveDate = JapaneseDate.of(annoDomini, 12, 31);

		//Wenn der Yuan der gleiche ist, wird der Yuan des Yuan zurückgegeben, andernfalls werden der Yuan und das Jahresende mit "・" verbunden und zurückgegeben
		if (japaneseNewYearDate.getEra().getValue() == japaneseNewYearEveDate.getEra().getValue()) {
			return japaseseFormat.format(japaneseNewYearDate);
		} else {
			return japaseseFormat.format(japaneseNewYearDate) + "・" + japaseseFormat.format(japaneseNewYearEveDate);
		}
	}
}

Ergebnis

1987(1987)
1988(1988)
1989(1988/2001)
1990(1990)

Es ist besorgniserregend, ob 1989 angezeigt werden soll (Showa 64, 1989). Ich bin Japaner, also möchte ich im ersten Jahr sein.

1987(1987)
1988(1988)
1989(1988)
1989(1991)
1990(1990)

Mag die richtige Anzeige sein, aber es kann verwirrend sein, 1989 oder 1990 geboren zu sein. (Ich denke, es wurde 1990 unter 1989 geboren. In Anbetracht der Möglichkeit von Fehlern wie denen, die das Auswahlfeld mit der Tastatur auswählen)

Recommended Posts

Schleifensatz mit westlichen und japanischen Kalendern [Notation wie 1990 (1990)]
[LINE @] Ich habe versucht, einen westlichen Kalender für einen japanischen Kalender zu konvertieren. BOT [Messaging API]