我想要日期格式为周号和年份的ISO格式为yyyy-'W'ww。但是,在H2数据库中只有星期功能可用的情况下,我只能得到没有年份的星期数。如何格式化以向其添加默认年份。像2016-'Www。

目前,我正在使用此功能(这绝对不是正确的方法)


  WEEK(PARSEDATETIME(TRUNC(“ + this.fieldName +”),'2016ww')
  WEEK(PARSEDATETIME(TRUNC(“ + this.fieldName +”),'2016-ww')


我无能为力。有人能帮我一下吗

最佳答案

在不同的库中有几种有效的解决方案。但是,您需要知道使用标准日历年“ 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

07-28 03:36
查看更多