Ben tarih 2012/12/28 içeren LocalDate
var ve hâli yerelleştirilmiş ay adı (Lehçe yani Aralık) ile yazdırmak istediğiniz Polonyalı hangi (grudnia ve grudzień sırasıyla) dan farklıdır. Ayrıca özel bir biçim kullanmak istiyoruz yarattığım benimkinin DateTimeFormatter
kullanılarak DateTimeFormatterBuilder
(AFAIK Joda-Time kendisine doğru yol olan):Ay adı Joda-Time DateTimeFormatter
private static final DateTimeFormatter CUSTOM_DATE_FORMATTER
= new DateTimeFormatterBuilder()
.appendLiteral("z dnia ")
.appendDayOfMonth(1)
.appendLiteral(' ')
.appendText(new MonthNameGenitive()) // <--
.appendLiteral(' ')
.appendYear(4, 4)
.appendLiteral(" r.")
.toFormatter()
.withLocale(new Locale("pl", "PL")); // not used in this case apparently
çıktı olmalı "z dnia 28 grudnia 2012 r. ".
Soruma soru bir okla işaretlenmiş satır hakkında: MonthNameGenitive
nasıl uygulamalıyım? Şu anda DateTimeFieldType
uzanır ve oldukça fazla kodu vardır: Ben pek çok sihirli yöntemleri uygulamak zorunda beri
final class MonthNameGenitive extends DateTimeFieldType {
private static final long serialVersionUID = 1L;
MonthNameGenitive() {
super("monthNameGenitive");
}
@Override
public DurationFieldType getDurationType() {
return DurationFieldType.months();
}
@Override
public DurationFieldType getRangeDurationType() {
return DurationFieldType.years();
}
@Override
public DateTimeField getField(final Chronology chronology) {
return new MonthNameGenDateTimeField(chronology.monthOfYear());
}
private static final class MonthNameGenDateTimeField
extends DelegatedDateTimeField {
private static final long serialVersionUID = 1L;
private static final ImmutableList<String> MONTH_NAMES =
ImmutableList.of(
"stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca",
"lipca", "sierpnia", "września", "października", "listopada",
"grudnia");
private MonthNameGenDateTimeField(final DateTimeField field) {
super(field);
}
@Override
public String getAsText(final ReadablePartial partial,
final Locale locale) {
return MONTH_NAMES.get(
partial.get(this.getType()) - 1); // months are 1-based
}
}
}
, özensiz ve bana değil kurşun geçirmez görünüyor artı (getAsText(ReadablePartial, Locale)
) süre DelegatedDateTimeField
kullanarak ve tek bir yöntemi geçersiz kılmasını ediyorum diğerleri de aynı isimde vardır:
getAsText(long, Locale)
getAsText(long)
getAsText(ReadablePartial, int, Locale)
getAsText(int, Locale)
istenen çıkışı (DateTimeFormatter
kullanarak) veya doğru yaklaşımım almak için daha iyi bir yaklaşım henüz çok ayrıntılı var mı?
DÜZENLEME: (JSR-310 dayanan Joda benzer,) yeni JDK8 Zaman API ile aynı şeyi başarmak için denedim ve kolayca yapılabilir
:
private static final java.time.format.DateTimeFormatter JDK8_DATE_FORMATTER
= new java.time.format.DateTimeFormatterBuilder()
.appendLiteral("z dnia ")
.appendValue(ChronoField.DAY_OF_MONTH, 1, 2, SignStyle.NORMAL)
.appendLiteral(' ')
.appendText(ChronoField.MONTH_OF_YEAR, MONTH_NAMES_GENITIVE) // <--
.appendLiteral(' ')
.appendValue(ChronoField.YEAR, 4)
.appendLiteral(" r.")
.toFormatter()
.withLocale(new Locale("pl", "PL"));
MONTH_NAMES_GENITIVE
özel ay isimleriyle Map<Long, String>
olup, kullanımı çok kolaydır. Bakınız DateTimeFormatterBuilder#appendText(TemporalField, Map)
. Bu değişiklik (benim kullanım örneği için doğru olmakla birlikte varsayılan olarak hâli içinde DateFormatSymbols.getInstance(new Locale("pl", "PL")).getMonths()
döner ay isimler ... Lehçe, söylediğimiz çünkü
İlginç JDK8 içinde bütün bu Polonyalı aylık isim hâli oyun gerekli değildir "bugün, 28 Aralık 2012", "genitive olarak ay isimlerini kullanıyor"), diğer bazı durumlarda (“Aralık 2012'yi aday göstererek kullanıyoruz”) zor olabilir ve geriye dönük olarak uyumsuz olabilir.
Aslında genitive kullanmak ve diğer (nominative?) Sürümünü ne zaman kullanmak için işe yaramıyor aslında biraz şaşırıyorum - biz kesinlikle Noda Time doğru elde etmeye çalışın. –
@JonSkeet JDK8'de, orijinallik/nominative versiyonun ['TextStyle'] (http://download.java.net/jdk8/docs/api/java/time/format/TextStyle.html) enum sabitleriyle desteklendiği görülüyor. 'FULL' /' FULL_STANDALONE' '' FULL' varsayılan ve Lehçe için genitive ve 'FULL_STANDALONE' nominative - ayrıca bkz [yerelleştirilmiş isimlerle bu XML dosyası] (http://hg.openjdk.java.net/threeten/ threeten/jdk/dosya/73a95812438c/src/share/sınıfları/güneş/util/CLDR/kaynaklar/21_0_1/ortak/ana/pl.xml). Yani .appendText (ChronoField.MONTH_OF_YEAR, TextStyle.FULL_STANDALONE) 'standart ay adı için kullanılabilir. – Xaerxess