#java #date #date-format #simpledateformat
#java #Дата #формат даты #simpledateformat
Вопрос:
'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
‘. Таким образом, последний день месяца должен быть автоматически выбран и передан в базу данных.
Пожалуйста, помогите мне в написании функции, которая выполняет вышеуказанную работу.
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));
}
}
Комментарии:
1. там опечатка в вашем примере 2008 года.
2. Действительно, вам нужно использовать
<
и первый день следующего месяца, иначе вы потеряете события в течение последнего дня месяца. Пример2009-12-31T13:00:00
должен попадать в диапазон2009-12 Dec
, но с вашим методом этого не происходит.3. используется @Ben <=. Как вы думаете, все еще будет проблема?
4. Да, потому что
2009-12-31T13:00:00 <= 2009-12-31
равно false. Правильная проверка была бы2009-12-31T13:00:00 < 2010-01-01
.
Ответ №1:
Преобразуйте его в 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:
- Используйте свой
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. Как вы получаете часть «последний день месяца»?
2. небольшое исправление — вернуть dbDateFormat.format(date.getTime()); должно быть возвращено dbDateFormat.format(cal.getTime());
Ответ №3:
Получить год и месяц из части строки «ГГГГ-ММ».
Используйте JODA для создания момента времени, соответствующего первому дню этого месяца. Переместить на месяц вперед и на один день назад. Сведите время к нужному вам строковому представлению.
Комментарии:
1. Переместите на месяц вперед и используйте
<
, иначе вы потеряете все события, которые происходят в последний день месяца в любое время, отличное от полуночи.
Ответ №4:
Привет, вам нужно проанализировать вашу дату, вот так
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
Комментарии:
1. Нет части «день» для анализа.
2. Пожалуйста, не смотрите ответы других.
Ответ №5:
java.time
Теперь намного проще с современными классами java.time, которые заменяют неудобные старые классы date-time, приведенные здесь в вопросе и других ответах.
Платформа java.time встроена в Java 8 и более поздние версии. Эти классы заменяют старые проблемные классы даты и времени, такие как java.util.Date
, .Calendar
amp; java.text.SimpleDateFormat
.
Теперь в режиме обслуживания проект Joda-Time также рекомендует перейти на java.time.
Чтобы узнать больше, смотрите руководство по Oracle. И выполните поиск в Stack Overflow для получения множества примеров и пояснений.
Большая часть функций java.time перенесена обратно на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в 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
, либо укажите свой собственный шаблон форматирования. Показано много раз во многих других вопросах и ответах по Stack Overflow.