如何使用Java向MSSQL插入格式为2016-01-01T19:33:15-05:00的日期时间?
问题根因
- 你当前的逻辑存在无意义的往返操作:
formatter.parse(formatter.format(new Date()))把格式化好的字符串又转回了java.util.Date对象,Date本身只存时间戳、不带任何格式与时区信息,插入数据库时自定义的格式和时区都会丢失。 - 数据库原生
datetime(2)类型默认不带时区存储,展示时会用数据库默认的日期格式,不会自带T分隔符与时区偏移后缀。
解决方案
根据你的存储需求分两种实现方式:
方案1:直接存储ISO 8601格式字符串
如果你要求数据库中字段存储的内容就是2016-01-01T19:33:15-05:00格式的文本,直接修改字段类型为varchar,调整代码如下:
// Entity字段改为String类型 private String transactionTime; // 格式化代码 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); // 设置你需要的时区,示例为西五区,即-05:00 formatter.setTimeZone(TimeZone.getTimeZone("GMT-5")); String timeStr = formatter.format(new Date()); obj.setTransactionTime(timeStr);
直接插入字符串即可满足格式要求。
方案2:保留日期类型、同时存储时区信息
如果你需要字段仍为日期类型方便后续计算,先将数据库字段改为带时区的日期类型(如MySQL的TIMESTAMP、PostgreSQL的timestamptz、SQL Server的DATETIMEOFFSET),Java端使用Java 8+ 提供的java.time包替换过时的Date类,代码如下:
// Entity字段改为OffsetDateTime类型 private OffsetDateTime transactionTime; // 直接赋值指定时区的当前时间 OffsetDateTime transactionTime = OffsetDateTime.now(ZoneOffset.ofHours(-5)); obj.setTransactionTime(transactionTime);
JDBC 4.2及以上版本、主流ORM框架(MyBatis 3.5+、Hibernate 5+)都原生支持OffsetDateTime和带时区日期字段的映射,查询时可以直接格式化为你需要的带时区ISO格式。
内容的提问来源于stack exchange,提问作者veejay
相关产品推荐
相关产品推荐

