Sorry, war faul heute Morgen, habe aber meine Hausaufgaben jetzt gemacht. ;-)
Es wird von MenuBar.updateDateItems() über createDateMenuItem() dann date.getLongDateString() aufgerufen. Dies wird an 2 weiteren Stellen aufgerufen. Die aus dem Fensterkopftext kenne ich - dieser Text ist auch falsch dekliniert. Der Aufruf aus der PluginTreeNode-Klasse kenne ich nicht. Der Aufruf aus der Programm-Anzeige-Plugin habe ich nicht gefunden.
Auf jeden Fall wird dann im getFormattedString() endgültig formatiert. Und zwar jedes Teil von dem Datum getrennt, und am Ende wird zusammengesetzt. Und das ist auch die Quelle des Problems.
Ich habe nach der guten Erklärung gesucht, und habe dann das hier gefunden. (stackoverflow questions 26642720)
Am besten ist aber die Erklärung aus JavaDoc selbst, das Teil über Monat und Kontext.(Link auf SimpleDateFormat bei JDK 17)
Um das schnell zu zeigen, habe ich folgendes kurze Beispiel geschrieben. Man merkt die Unterschiede am Ende des Monatsnamen, mit und ohne Kontext.
Code: Alles auswählen
import java.util.*;
import java.lang.*;
import java.time.*;
import java.text.SimpleDateFormat;
public class FormateDate {
public static void main(String[] args) {
for (int loopVar=0; loopVar<12; loopVar++) {
Date loopDate = Date.from(LocalDate.now( ).plusMonths( loopVar ).atStartOfDay(ZoneId.systemDefault()).toInstant());
System.out.println(new SimpleDateFormat("dd MMMM YYYY", new Locale("ru")).format(loopDate));
System.out.println(new SimpleDateFormat("MMMM", new Locale("ru")).format(loopDate));
}
}
}
Daher habe ich nach der kurzen Überlegung folgendes Vorschlag: Man soll nicht getrennt formatieren und dann zusammensetzten, sondern erst den richtigen Pattern zusammensetzten und dann gemeinsam formatieren. Dann hat man auch den Kontext. Eventuell ist das in einigen Sprachen auch für den Tag der Woche wichtig.
Ich habe die Methode umgeschrieben und ich hoffe, es kann so auch gehen ohne Seiteneffekte.
Code: Alles auswählen
private String getFormattedString_new(final boolean longDay, final boolean longMonth) {
Calendar cal = getCalendar();
String day = longDay ? "EEEEEE" : "E";
String month = longMonth ? "MMMMMM" : "MMM";
String dayOfMonth = "d";
java.util.Date javaDate = new java.util.Date(getCalendar().getTimeInMillis());
return new SimpleDateFormat(LOCALIZER.msg("datePattern", "{0}, {1} {2}", day, month, dayOfMonth)).format(javaDate);
// return LOCALIZER.msg("datePattern", "{0}, {1} {2}", day.format(javaDate), month.format(javaDate), Integer
// .toString(dayOfMonth));
}
Die andern Stellen, an denen SimpleDateFormat.format() aufgerufen wird, scheinen mir unproblematisch zu sein. Es werden da feste, kurze Formatierung-Pattern benutzt.
Sorry, war faul heute Morgen, habe aber meine Hausaufgaben jetzt gemacht. ;-)
Es wird von MenuBar.updateDateItems() über createDateMenuItem() dann date.getLongDateString() aufgerufen. Dies wird an 2 weiteren Stellen aufgerufen. Die aus dem Fensterkopftext kenne ich - dieser Text ist auch falsch dekliniert. Der Aufruf aus der PluginTreeNode-Klasse kenne ich nicht. Der Aufruf aus der Programm-Anzeige-Plugin habe ich nicht gefunden.
Auf jeden Fall wird dann im getFormattedString() endgültig formatiert. Und zwar jedes Teil von dem Datum getrennt, und am Ende wird zusammengesetzt. Und das ist auch die Quelle des Problems.
Ich habe nach der guten Erklärung gesucht, und habe dann das hier gefunden. (stackoverflow questions 26642720)
Am besten ist aber die Erklärung aus JavaDoc selbst, das Teil über Monat und Kontext.(Link auf SimpleDateFormat bei JDK 17)
Um das schnell zu zeigen, habe ich folgendes kurze Beispiel geschrieben. Man merkt die Unterschiede am Ende des Monatsnamen, mit und ohne Kontext.
[code]
import java.util.*;
import java.lang.*;
import java.time.*;
import java.text.SimpleDateFormat;
public class FormateDate {
public static void main(String[] args) {
for (int loopVar=0; loopVar<12; loopVar++) {
Date loopDate = Date.from(LocalDate.now( ).plusMonths( loopVar ).atStartOfDay(ZoneId.systemDefault()).toInstant());
System.out.println(new SimpleDateFormat("dd MMMM YYYY", new Locale("ru")).format(loopDate));
System.out.println(new SimpleDateFormat("MMMM", new Locale("ru")).format(loopDate));
}
}
}[/code]
Daher habe ich nach der kurzen Überlegung folgendes Vorschlag: Man soll nicht getrennt formatieren und dann zusammensetzten, sondern erst den richtigen Pattern zusammensetzten und dann gemeinsam formatieren. Dann hat man auch den Kontext. Eventuell ist das in einigen Sprachen auch für den Tag der Woche wichtig.
Ich habe die Methode umgeschrieben und ich hoffe, es kann so auch gehen ohne Seiteneffekte.
[code]
private String getFormattedString_new(final boolean longDay, final boolean longMonth) {
Calendar cal = getCalendar();
String day = longDay ? "EEEEEE" : "E";
String month = longMonth ? "MMMMMM" : "MMM";
String dayOfMonth = "d";
java.util.Date javaDate = new java.util.Date(getCalendar().getTimeInMillis());
return new SimpleDateFormat(LOCALIZER.msg("datePattern", "{0}, {1} {2}", day, month, dayOfMonth)).format(javaDate);
// return LOCALIZER.msg("datePattern", "{0}, {1} {2}", day.format(javaDate), month.format(javaDate), Integer
// .toString(dayOfMonth));
}
[/code]
Die andern Stellen, an denen SimpleDateFormat.format() aufgerufen wird, scheinen mir unproblematisch zu sein. Es werden da feste, kurze Formatierung-Pattern benutzt.