2014-02-09 4 views
4

Im используя Joda Time для форматирования DATETIME следующим образом:Как получить локали формат даты на месяц и день

DateTimeFormatter dateFormatter = DateTimeFormat.longDate(); 
String startTimeStr = dateFormatter.print(localStartTime); 

значения переменных являются:

localStartTime={[email protected]}"2013-04-06T23:54:35.000" 
startTimeStr={[email protected]}"2013年4月6日" 

Проблема заключается в том, как я смог получить формат даты в месяц и день? Я попытался следующие коды:

DateTimeFormatter monDayFormatter = DateTimeFormat.forPattern("MMMd"); 
String startTimeStr = monDayFormatter.print(localStartTime); 

и значения переменных являются:

localStartTime={[email protected]}"2013-04-06T23:54:35.000" 
startTimeStr={[email protected]}"4月6" 

Что я ожидал startTimeStr является 4月6日. Здесь китайский символ = Day. Я не хочу жестко кодировать шаблон в «MMMd 日», потому что он должен настраиваться в соответствии с текущей информацией о локали. Любая помощь будет оценена.

ответ

5

На сайте юникода консорциума, вы найдете в китайском CLDR repository Например записи нравится следующим образом (тип календаря = григорианского):

<dateFormats> 
    <dateFormatLength type="full"> 
    <dateFormat> 
    <pattern>y年M月d日EEEE</pattern> 
    </dateFormat> 
    </dateFormatLength> 
    <dateFormatLength type="long"> 
    <dateFormat> 
     <pattern>y年M月d日</pattern> 
    </dateFormat> 
    </dateFormatLength> 
    <dateFormatLength type="medium"> 
    <dateFormat> 
     <pattern>y年M月d日</pattern> 
    </dateFormat> 
    </dateFormatLength> 
    <dateFormatLength type="short"> 
    <dateFormat> 
     <pattern>yy/M/d</pattern> 
    </dateFormat> 
    </dateFormatLength> 
</dateFormats> 

Внутренне каждый локализованный формат даты либо в JodaTime или в классах JDK DateFormat будет быть переведены на такой шаблон, включая литералы типа «日». CLDR не определяет месяц-день-только-формат, но это лишь часть общего год-месяц-день-формате, так что если вы используете в качестве замены для

DateTimeFormatter dateFormatter = DateTimeFormat.longDate().withLocale(Locale.CHINESE); 
LocalDateTime localStartTime = new LocalDateTime(2013,4,6,23,54,35); 
String startTimeStr = dateFormatter.print(localStartTime); 
System.out.println(startTimeStr); // output: 2013年4月6日 

этот код:

DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("M月d日"); 
LocalDateTime localStartTime = new LocalDateTime(2013,4,6,23,54,35); 
String startTimeStr = dateFormatter.print(localStartTime); 
System.out.println(startTimeStr); // output: 4月6日 

тогда вы получаете то, что хотите. Хотя вы пишете:

Я не хочу жесткий код шаблона в «MMMd 日»

, который в значительной степени та же процедура, как это сделано внутренне библиотеками. Таким образом, сам шаблон локализуется путем выбора соответствующих литералов. Невозможно извлечь из CLDR локализованный шаблон даты без года. Если вы этого хотите, тогда вам нужно управлять собственным набором локализованных месячных шаблонов для разных мест, возможно, на карте < Locale, String >.

Обновление от 2016-12-06:

Ситуация не имеющая общий месяц-день-шаблон для любой языковой версии не изменилось Joda-Time. К сожалению, официальный преемник Joda-Time, JSR-310 (java.time -пакет) тоже не справляется, см. JDK-issue 8168532. Это было достаточной причиной для того, чтобы я нашел решение для своего времени библиотеки Time4J в среднем. Тщательный анализ данных CLDR показал, что существуют другие форматы дат для многих языков, но в другом разделе и accessible via a group of fields. Ключи «Md», «MMMd» и «MMMMd» относятся к вашему прецеденту.Пример в Time4J (который, мы надеемся, должны быть поддержаны JSR-310, тоже в будущем выпуске):

PlainTimestamp tsp = Iso8601Format.EXTENDED_DATE_TIME.parse("2013-04-06T23:54:35.000"); 
    AnnualDate ad = AnnualDate.of(tsp.getMonth(), tsp.getDayOfMonth()); 
    ChronoFormatter<AnnualDate> chinese = 
     ChronoFormatter.ofStyle(DisplayMode.LONG, Locale.CHINESE, AnnualDate.chronology()); 
    ChronoFormatter<AnnualDate> english = 
     ChronoFormatter.ofStyle(DisplayMode.LONG, Locale.ENGLISH, AnnualDate.chronology()); 
    System.out.println(chinese.format(ad)); // 4月6日 
    System.out.println(english.format(ad)); // Apr 6 

Также стоит отметить, что языковой стандарт не может быть изменен после того, как строительство форматировщиком в разумный путь, потому что локализованная структура структуры будет замораживаться во время строительства и более нечувствительна к последующим изменениям локали. Однако это будет улучшено в будущем выпуске.

2

Здесь вы идете:

Calendar calendar = Calendar.getInstance(); 
    SimpleDateFormat day_week = new SimpleDateFormat("EEEE"); 
    SimpleDateFormat month_date = new SimpleDateFormat("MMMMMMMMM"); 
    Date d = new Date(); 
    String dayOfTheWeek = day_week.format(d); 
    String month = month_date.format(calendar.getTime()); 

Надеется, что это помогает.

+1

В нем говорится, что Joda-Time. –

Смежные вопросы