Ako riesite zobrazenie mesiacov v Jave 8?
Mnohe kniznice pouzivaju:
DateFormatSymbols dateFormatSymbols = new DateFormatSymbols(locale);
String[] monthNames = dateFormatSymbols.getMonths();
To este v Jave 7 fungovalo. V Jave 8 to nejaky odbornik nekompatibilne "vylepsil" (http://bugs.java.com/view_bug.do?bug_id=7079560 (http://bugs.java.com/view_bug.do?bug_id=7079560) - refreshnite, aby sa to nacitalo), takze si uzivatel namiesto "leden", "unor", atd, vybera mesiace "ledna", "unora", "brezna".
Ake je na to rozumne a rychle riesenie? Ide mi naozaj iba o chovanie ako v Jave7 aj v cudzich knizniciach, nic viac neziadam.
Detekcia Javy a volanie getDisplayNames na Calendar s nejakymi divnymi konstantami (v Jave7 este nie su kontanty STANDALONE) a to cele vlozene aspectom namiesto aktualnej implementacie mi naozaj nesedia.
V Cobolu by se to nestalo. Pouzivej Cobol, jak vidis, ma smysl.
import java.time.Month;
import java.time.format.TextStyle;
Month.JANUARY.getDisplayName(TextStyle.FULL_STANDALONE, new Locale("cs"));
> leden
Pokud potřebuješ podporovat i Javu < 8, tak existuje backport JSR-310: http://www.threeten.org/threetenbp/
Pomstu IBM jménem java.util.Calendar spláchni do kanalizace tak, jak si už dávno zaslouží. ;)
Citace od: aaa kdy 07. 01. 2015, 00:11:57
Ako riesite zobrazenie mesiacov v Jave 8?
Mnohe kniznice pouzivaju:
DateFormatSymbols dateFormatSymbols = new DateFormatSymbols(locale);
String[] monthNames = dateFormatSymbols.getMonths();
To este v Jave 7 fungovalo. V Jave 8 to nejaky odbornik nekompatibilne "vylepsil" (http://bugs.java.com/view_bug.do?bug_id=7079560 (http://bugs.java.com/view_bug.do?bug_id=7079560) - refreshnite, aby sa to nacitalo), takze si uzivatel namiesto "leden", "unor", atd, vybera mesiace "ledna", "unora", "brezna".
Otázka je, co s tím měli dělat. ,,3. ledna" má být ,,ledna", ne ,,leden". Asi vyhodnotili, že více lidí zobrazuje měsíce se dnem místo bez něj, tak vybrali tuhle variantu jako výchozí.
Citace od: aaa kdy 07. 01. 2015, 00:11:57
Ake je na to rozumne a rychle riesenie? Ide mi naozaj iba o chovanie ako v Jave7 aj v cudzich knizniciach, nic viac neziadam.
Detekcia Javy a volanie getDisplayNames na Calendar s nejakymi divnymi konstantami (v Jave7 este nie su kontanty STANDALONE) a to cele vlozene aspectom namiesto aktualnej implementacie mi naozaj nesedia.
Použil bych reflexi na
LONG_STANDALONE s fallbackem na
LONG. Od toho ji Java umí.
import java.time.Month;
import java.time.format.TextStyle;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class Main {
public static List<String> getMonthNames() {
Locale locale = new Locale("sk");
List<String> monthNames = new ArrayList<String>();
for (Month month : Month.values()) {
monthNames.add(month.getDisplayName(TextStyle.FULL_STANDALONE,
locale));
}
return monthNames;
}
public static void main(String args[]) {
System.out.println(getMonthNames());
}
}
oni len opravili bug z roku 1999 :-)
akurat to opravili tak, ze pokazili stare aplikacie, v kazdom pripade ine riesenie, nez to, ktore navrhuje sten, neexistuje. podla vsetkeho ani joda-time nepomoze, lebo to delegovala na jdk
ono teda zalezi na tom, co chcete ziskat
Hm, tak ten 310 backport se chová stejně blbě. Na JRE 6 a 7 vypisuje "leden", zatímco na 8 "ledna".
Já vidím 2 možnosti, buď jak píšou předřečníci, mít 2 casy, pro jre 8 a pro starší. Není ale nutné používat reflexi, je to intová konstanta, takže lze použít přímo její hodnotu. Zjistit verzi jre za runtimu lze např. přes property java.version, jenom je třeba počítat s tím, že za 2 roky tu může být i verze 9.
Druhá možnost je to celé vochcat a místo leden, únor použít zkrácenou podobu led, ún anebo rovnou čísla. Je ale otázka, jestli se u nějakých divných jazyků neliší pády i těchto zkrácených forem.
no a nepomohlo by treba zmenit poradi linkovanych knihoven a vlozit doprostred svoji vlastni, ve ktere bude implementovana korektne fungujici funkce?
/trololo
Citace od: oldies kdy 07. 01. 2015, 12:24:47
no a nepomohlo by treba zmenit poradi linkovanych knihoven a vlozit doprostred svoji vlastni, ve ktere bude implementovana korektne fungujici funkce?
/trololo
Anebo:
String[] czechMonths = { "leden", "únor", "březen", ... };/trololo
Citace od: Natix kdy 07. 01. 2015, 11:54:06
Já vidím 2 možnosti, buď jak píšou předřečníci, mít 2 casy, pro jre 8 a pro starší. Není ale nutné používat reflexi, je to intová konstanta, takže lze použít přímo její hodnotu. Zjistit verzi jre za runtimu lze např. přes property java.version, jenom je třeba počítat s tím, že za 2 roky tu může být i verze 9.
Jak tu verzi budete parsovat, když je v nedefinovaném formátu? IMO je lepší místo parsování java.version zjistit přes reflexi, že to vaše JRE podporuje.
Citace od: Sten kdy 07. 01. 2015, 13:24:30
Citace od: Natix kdy 07. 01. 2015, 11:54:06
Já vidím 2 možnosti, buď jak píšou předřečníci, mít 2 casy, pro jre 8 a pro starší. Není ale nutné používat reflexi, je to intová konstanta, takže lze použít přímo její hodnotu. Zjistit verzi jre za runtimu lze např. přes property java.version, jenom je třeba počítat s tím, že za 2 roky tu může být i verze 9.
Jak tu verzi budete parsovat, když je v nedefinovaném formátu? IMO je lepší místo parsování java.version zjistit přes reflexi, že to vaše JRE podporuje.
Tak alespoň property java.specification.version by mohla být jasně specifikovaná ("1.7", "1,8"). Anebo když už, tak už:
switch (SourceVersion.latest()) {
case RELEASE_6:
case RELEASE_7:
format = Calendar.LONG_FORMAT;
case RELEASE_8:
default:
format = 32770; // Calendar.LONG_STANDALONE
}
Vdaka - nejak mi to nefunguje, ked sa jedna o pouzitie v cudzom kode (JCalendar), ale v mojom to vyzera trochu nadejne.