Java 如何在H2中将周数格式化为所需格式

Java 如何在H2中将周数格式化为所需格式,java,date,timestamp,h2,week-number,Java,Date,Timestamp,H2,Week Number,我想要一个带有周数和年的日期格式,ISO格式为yyyy-'W'ww。然而,由于H2数据库中只有week函数可用,因此我只能获得没有年份的周数。如何设置格式,以便在其中添加默认年份。大概是2016年——W'ww 目前,我正在使用此功能(这绝对不是正确的方式) 周(PARSEDATETIME(TRUNC(“+this.fieldName+”),'2016ww') 周(PARSEDATETIME(TRUNC(“+this.fieldName+”),'2016-ww') 我没有其他办法了。这里有人能帮我

我想要一个带有周数和年的日期格式,ISO格式为yyyy-'W'ww。然而,由于H2数据库中只有week函数可用,因此我只能获得没有年份的周数。如何设置格式,以便在其中添加默认年份。大概是2016年——W'ww

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

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

我没有其他办法了。这里有人能帮我吗 2018-W13

细节 当您从H2获取
Date
类型作为时,将其转换为
java.time.LocalDate

LocalDate ld = mySqlDate.toLocalDate();
您可以询问标准,其中第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 );
更简单的是使用项目中的类

JDBC4.2 从JDBC 4.2及更高版本开始,您可以直接与数据库交换java.time对象,无需再次过度使用java.util或java.sql日期时间类

LocalDate ld = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;  // Capture the current date as seen in the wall-clock used by the people in a certain region (a time zone).
myPreparedStatement.setObject( … , ld ) ;
和检索

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
classes

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(在不同的库中有几种有效的解决方案。但是,您需要知道,使用标准日历年“y”是错误的。相反,您必须使用带有符号“y”(大写字母)的工作日年(

      使用旧
      日历的示例

      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所需的正确配置


      使用my library的示例,如果您还计划对获得的日历周进行一些算术运算(如
      plusWeeks(5)
      或计划获得一些样式化的本地化输出),则该示例只会很有趣,并给出一个剩余值:


      此.fieldName
      的数据类型和内容到底是什么?它是列名。比如说,数据类型为“日期”的“时间”澄清应该作为对问题的编辑而不是评论发布。
      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.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
      
      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