Java 如何在H2中将周数格式化为所需格式
我想要一个带有周数和年的日期格式,ISO格式为yyyy-'W'ww。然而,由于H2数据库中只有week函数可用,因此我只能获得没有年份的周数。如何设置格式,以便在其中添加默认年份。大概是2016年——W'ww 目前,我正在使用此功能(这绝对不是正确的方式) 周(PARSEDATETIME(TRUNC(“+this.fieldName+”),'2016ww') 周(PARSEDATETIME(TRUNC(“+this.fieldName+”),'2016-ww') 我没有其他办法了。这里有人能帮我吗 2018-W13 细节 当您从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') 我没有其他办法了。这里有人能帮我
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的示例:
旁注:我在这里选择了法国的地区,以确保ISO-8601所需的正确配置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
使用my library的示例,如果您还计划对获得的日历周进行一些算术运算(如
或计划获得一些样式化的本地化输出),则该示例只会很有趣,并给出一个剩余值:plusWeeks(5)
此.fieldNamejava.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