1.问题
sqlite数据库
user表,create_time字段,类型DATETIME,设置默认值datetime('now')
mybatis,User实体,createTime类型为java.util.Date
插入一条数据
@Test @Transactional @Rollback(false) public void insert(){ User user = new User(); user.setId("3"); user.setUsername("user1"); user.setName("王五"); user.setAge(18); userService.insert(user); }
查询数据
@Test public void get(){ try{ List<User> list = userService.get(); for(User user : list){ System.err.println(user); } }catch(Exception e){ e.printStackTrace(); } }
抛出异常
Caused by: java.text.ParseException: Unparseable date: "2019-12-12 12:08:26" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++) at org.sqlite.date.FastDateParser.parse(FastDateParser.java:299) at org.sqlite.date.FastDateFormat.parse(FastDateFormat.java:490) at org.sqlite.jdbc3.JDBC3ResultSet.getTimestamp(JDBC3ResultSet.java:540) ... 77 more
2.解决问题
方法1:将create_time字段默认值改为strftime('%s','now')
建议使用这种方式,因为如果从java里插入时间数据,将会插入数字(1970年1月1日到现在的秒数)
@Test @Transactional @Rollback(false) public void insert(){ User user = new User(); user.setId("5"); user.setUsername("user1"); user.setName("王五"); user.setAge(18); user.setCreateTime(new Date(100000000000L)); userService.insert(user); }
方法2:或者strftime('%Y-%m-%d %H:%M:%f','now')
3.sqlite获取当前时间
3.1获取当前时间:
select datetime('now')
结果:2017-04-12 09:47:12
3.2如果需要精确到毫秒,使用:
select strftime('%Y-%m-%d %H:%M:%f','now')
结果:2017-04-12 17:48:35.890
3.3获取从1970年1月1日到现在的秒数(Unix时间戳):
select strftime('%s','now')
结果:1491985972
4.原理
sqlite将字符串转换为Date使用FastDateFormat转换
等同于下面代码
@Test public void test() throws ParseException{ FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS"); Date d = dateFormat.parse("2019-12-12 19:26:55"); System.err.println(d); }