формат даты от 14 авг до ГГГГММДД - PullRequest
3 голосов
/ 07 марта 2011

Измените дату 14 августа 2011 года на формат 20110814 .. как я могу это сделать в Java?

Здесь 14aug это строка ... String date = "14aug";

Ответы [ 4 ]

24 голосов
/ 07 марта 2011
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String yyyyMMdd = sdf.format(date);

Ссылка: java.text.SimpleDateFormat

Обновление: вопрос от Элитного Джентльмена важен.Если вы начинаете с String, то сначала нужно разобрать его, чтобы получить объект date из приведенного выше примера:

Date date = new SimpleDateFormat("dd MMM yyyy").parse(dateString);
3 голосов
/ 09 июня 2017

Другие ответы были хорошими в 2011 году, когда они были написаны. Время движется. Сегодня никто не должен использовать давно устаревшие классы SimpleDateFormat и Date. Современный ответ использует классы java.time:

    String date = "14 aug 2011";
    DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("dd MMM uuuu")
            .toFormatter(Locale.ENGLISH);
    System.out.println(LocalDate.parse(date, parseFormatter)
                        .format(DateTimeFormatter.BASIC_ISO_DATE));

Это печатает желаемый:

20110814

Современный механизм синтаксического анализа несколько более строг, потому что опыт показывает, что старый был слишком снисходительным и часто приводил к неожиданным результатам в ситуациях, когда можно было ожидать сообщения об ошибке. Например, современный требует правильного регистра, то есть заглавная буква A в английском языке в августе, , если только мы не скажем, что он должен анализироваться без учета регистра. Вот что я делаю с parseCaseInsensitive(). Этот вызов влияет на после вызовов методов построителя, поэтому мы должны поместить его до appendPattern().

Редактировать: Взяв вашу строку "14aug" из вопроса буквально. SimpleDateFormat использовал бы 1970 год по умолчанию (год эпохи), что затрудняло бы получение правильного года. Современные классы позволяют явно указывать год по умолчанию, например:

    String date = "14aug";
    DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("ddMMM")
            .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.systemDefault()).getValue())
            .toFormatter(Locale.ENGLISH);

С этим изменением, запустив код сегодня, мы получим:

20170814

Редактировать 2: Теперь используйте DateTimeFormatter.BASIC_ISO_DATE для форматирования, как рекомендовано в Ответ Василия Бурка .

1 голос
/ 09 июня 2017

Ответ Ole VV превосходен.Он показывает вам современный подход, использующий классы java.time, а не трудоемкие старые классы даты и времени (Date & Calendar).

MonthDay

Я расширю этоОтвет, добавив одну мысль: Вы можете представить свой ввод числа дня месяца и сокращенного названия месяца как MonthDay объект.

Чтобы понять использование DayeTimeFormatterBuilder здесьсм., что другие Ответ от Ole VV .

String input = "11aug" ;
DateTimeFormatter f = 
    new DateTimeFormatterBuilder()  
        .parseCaseInsensitive()
        .appendPattern( "ddMMM" )
        .toFormatter( Locale.ENGLISH )
;
MonthDay md = MonthDay.parse( input , f ) ;

md.toString (): --08-11

Если возможно,Я предлагаю использовать стандартный формат ISO 8601 --MM-DD для текстового представления значения дня месяца, а не свой собственный нестандартный формат.Классы java.time, включая MonthDay, используют стандартные форматы по умолчанию при разборе и генерации строк, поэтому не нужно указывать шаблон форматирования.Для анализа: MonthDay md = MonthDay.parse( "--08-11" ) ;.

Создайте значение только для даты, указав желаемый год.В частности, объект LocalDate.

LocalDate ld = md.atYear( 2011 ) ; 

ld.toString (): 2011-08-11

Ваш требуемый формат вывода соответствует стандартным форматам ISO 8601.Ваш формат - «Базовая» версия, которая сводит к минимуму использование разделителей.Этот формат уже определен в DateTimeFormatter.BASIC_ISO_DATE.

String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE ) ;

20110811

1 голос
/ 08 марта 2011

Хотя пример, данный Bozho, хорош для английской локали, он может не работать в других локалях (если "aug" не является названием месяца в другой локали). Для моей среды с польскими языками я бы предпочел использовать что-то вроде:

ParsePosition pos = new ParsePosition(0);
Date date = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH).parse("14 aug 2011", pos);

Также обратите внимание на использование ParsePosition, которое в случае проблем с синтаксическим анализом (тогда date будет null) сообщит вам, в какой позиции при разборе возникли проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...