преобразовать дату из формата "2009-12 декабря" в "31-DEC-2009" - PullRequest
4 голосов
/ 01 октября 2010
'2009-12 Dec' should be converted to '31-DEC-2009'
'2010-09 Sep' should be converted to '30-SEP-2010'
'2010-02 Feb' should be converted to '28-FEB-2010'
'2008-02 Feb' should be converted to '29-FEB-2008'

Значения 2009-12 декабря , 2008-02 февраля будут отображаться пользователю в раскрывающемся списке.Пользователь не имеет возможности выбрать ДЕНЬ .

Выбранное пользователем значение должно быть передано в базу данных.Но база данных ожидает дату в формате DD-MMM-YYYY.Запрос имеет условие <= USER_DATE.Итак, последний день месяца должен быть автоматически выбран и передан в базу данных.

Pl, помогите мне написать функцию, которая выполняет вышеуказанную работу.

static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");

    public static String convertMapedToSqlFormat(final String maped) {
        String convertedMaped = null;
        //....
        return convertedMaped;
    }

    @Test
    public void testConvertMapedToSqlFormat() {
        String[] mapedValues = { "2009-12 Dec", "2009-11 Nov", "2009-10 Oct",
                "2009-09 Sep", "2009-08 Aug", "2009-07 Jul", "2009-06 Jun",
                "2009-05 May", "2009-04 Apr", "2009-03 Mar", "2009-02 Feb",
                "2009-01 Jan", "2008-12 Dec", "2008-11 Nov", "2008-10 Oct" };
        for (String maped : mapedValues) {
            System.out.println(convertMapedToSqlFormat(maped));
        }
    }

Ответы [ 5 ]

7 голосов
/ 01 октября 2010

Преобразуйте его в Calendar и используйте Calendar#getActualMaximum(), чтобы получить последний день месяца и установить день с ним.

Пример запуска:

String oldString = "2009-12 Dec";
Calendar calendar = Calendar.getInstance();
calendar.setTime(new SimpleDateFormat("yyyy-MM").parse(oldString)); // Yes, month name is ignored but we don't need this.
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
String newString = new SimpleDateFormat("dd-MMM-yyyy").format(calendar.getTime()).toUpperCase();
System.out.println(newString); // 31-DEC-2009
2 голосов
/ 01 октября 2010
  • Используйте ваш DateFormat (но установите его на yyyy-dd MMM), чтобы проанализировать дату
  • преобразовать Date в Calendar
  • Использование Calendar.getActualMaximim()
  • используйте dd-MMM-yyyy для форматирования полученной даты.
  • звонок .toUpperCase()

Итак:

static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");
static SimpleDateFormat dbDateFormat = new SimpleDateFormat("yyyy-MMM-dd");

public static String convertMapedToSqlFormat(final String maped) {
    Date date = dateFormat.parse(mapped);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    return dbDateFormat.format(cal.getTime()).toUpperCase();
}

Несколько заметок:

  • если возможно, используйте joda-time DateTime
  • избегайте использования строгих форматов даты в базе данных.
1 голос
/ 01 октября 2010

Получить год и месяц из YYYY-MM части строки.

Используйте JODA, чтобы создать момент времени, соответствующий первому дню этого месяца. Двигайтесь на один месяц вперед и на один день назад. Выровняйте время до нужного вам строкового представления.

0 голосов
/ 13 августа 2016

java.time

Теперь стало намного проще с современными классами java.time, которые вытесняют проблемные старые классы даты и времени, которые можно увидеть здесь в Вопросе и других ответах.Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют старые проблемные классы даты и времени, такие как java.util.Date, .Calendar и & java.text.SimpleDateFormat.

Теперь в режиме обслуживания , проект Joda-Time также рекомендует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial .И поищите в Stack Overflow множество примеров и объяснений.

Большая часть функций java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android in ThreeTenABP .

Проект ThreeTen-Extra расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.

YearMonth

Класс YearMonth предоставляет именно то, что вы хотите.

YearMonth start = YearMonth.of( 2008 , Month.OCTOBER );
YearMonth stop = YearMonth.of( 2009 , Month.DECEMBER );
List<YearMonth> yms = new ArrayList<>();
YearMonth ym = start ;
while( ! ym.isAfter( stop ) ) {
    yms.add( ym );
    // Set up the next loop.
    ym = ym.plusMonths( 1 ); 
}

Чтобы представить, используйте DateTimeFormatter длясгенерируйте строковое представление значения YearMonth.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM MMM" );
f = f.withLocale( Locale.CANADA_FRENCH );  // Or Locale.US etc.
String output = ym.format( f );

Чтобы получить последний день месяца, опросите объект YearMonth.

LocalDate endOfMonth = ym.atEndOfMonth();

Чтобы представить, используйтеDateTimeFormatter.Либо разрешите создать экземпляр средства форматирования, которое автоматически локализуется в соответствии с указанным Locale, либо укажите свой собственный шаблон форматирования.Много раз показано во многих других вопросах и ответах о переполнении стека.

0 голосов
/ 01 октября 2010

Привет, тебе нужно разобрать свою дату, вот так

      SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
      Date du = new Date();
      du = df.parse(sDate);
      df = new SimpleDateFormat("yyyy-MM-dd");
      sDate = df.format(du);

Надеюсь, это поможет.Дайте мне знать, если это так.

PK

...