2017-01-09 2 views
1

Я хочу формат даты с номером недели и годом в формате ISO yyyy-'W'ww. Однако, имея только функцию недели, доступную в базе данных H2, я могу получить только номер недели без года. Как я могу форматировать таким образом, чтобы добавить к нему год по умолчанию. Что-то вроде 2016 года.Как отформатировать номер недели в желаемом формате в H2

В настоящее время я использую эту функцию (что, безусловно, не правильный путь)

WEEK (PARSEDATETIME (TRUNC ("+ this.fieldName +"), '2016ww') WEEK (PARSEDATETIME (. TRUNC ("+ this.fieldName +"), '2016-WW')

Я не могу получить то, что еще можно сделать, может кто-нибудь помочь мне здесь

+0

Что именно представляет собой тип данных и содержание 'this.fieldName'? –

+0

Это имя столбца. Скажем, «Время», имеющее тип данных «DATE» – Vishnukk

+0

Разъяснения должны быть опубликованы как изменения в ваших Вопросах, а не как комментарии. –

ответ

0

ТЛ; Др

YearWeek.from(mySqlDate.toLocalDate()).toString() 

Подробности

Когда вы запрашиваете ваш Date тип из Н2 в качестве java.sql.Date, преобразующие в java.time.LocalDate.

LocalDate ld = mySqlDate.toLocalDate(); 

Вы можете опрашивать для ISO 8601 стандартной definition of a week где неделю # 1 содержит первый четверг года, и работает с понедельника по воскресенье.

int weekNumber = ld.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) ; 

Извлечь год.

int year = ld.getYear(); 

Соберите стандартную строку ISO 8601.

String output = year + "-W" + String.format("%02d ", weekNumber); 

Еще проще это использовать YearWeek класс от проекта ThreeTen-Extra.

String output = YearWeek.from(ld).toString() ; 
1

В разных библиотеках существует несколько действующих решений. Однако вам нужно знать, что использование стандартного календарного года «y» было бы неправильным. Вместо этого у вас должно быть использовать год недели (или названный год недели) с символом «Y» (заглавная буква).

Пример использования старых Calendar -stuff:

java.sql.Date sqlDate = new java.sql.Date(2017 - 1900, 0, 1); // 2017-01-01 
GregorianCalendar gcal = new GregorianCalendar(); 
gcal.setFirstDayOfWeek(Calendar.MONDAY); 
gcal.setMinimalDaysInFirstWeek(4); 
gcal.setTime(sqlDate); 
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-'W'ww"); 
System.out.println(sdf.format(gcal.getTime())); // 2016-W52 

Пример использования Java-8:

java.sql.Date sqlDate = new java.sql.Date(2017 - 1900, 0, 1); // 2017-01-01 

LocalDate ld = sqlDate.toLocalDate(); 
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-'W'ww", Locale.FRANCE); 
System.out.println(dtf.format(ld)); // 2016-W52 

примечание стороны: я здесь выбрал локаль Франции в обеспечить правильную конфигурацию недели, необходимую для ISO-8601.


примера с помощью моей библиотеки Time4J, которая только интересно и дает прибавочную стоимость, если вы планируете сделать некоторые арифметические действия с полученной календарной неделей (как plusWeeks(5) или планируете получить субэлемент локализованного выхода):

java.sql.Date sqlDate = new java.sql.Date(2017 - 1900, 0, 1); // 2017-01-01 
PlainDate value = JDBCAdapter.SQL_DATE.translate(sqlDate); 
CalendarWeek cw = 
    CalendarWeek.of(
     value.get(PlainDate.YEAR_OF_WEEKDATE), 
     value.get(Weekmodel.ISO.weekOfYear()) 
    ); 
System.out.println(cw.toString()); // 2016-W52 
Смежные вопросы