Groovy中解析数据库日期字符串为指定格式失败求助
解决日期解析与格式化问题
你的问题核心在于解析时使用的格式和输入日期字符串的格式不匹配——你用目标输出格式yyyy-MM-dd'T'HH:mm:ssZ去解析输入的20180502160645(格式是yyyyMMddHHmmss),格式完全不对,自然会解析失败。正确的流程应该是:先用输入日期的格式把字符串解析成日期对象,再用目标格式把日期对象格式化成你想要的字符串。
下面提供两种解决方案,优先推荐Java 8+的新日期API(更安全、更易用):
方案一:使用Java 8+的java.time API(推荐)
旧的Date和SimpleDateFormat存在线程不安全、API设计混乱等问题,Java 8引入的java.time包是更好的选择。
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; public class DateConverter { public static void main(String[] args) { String inputDateStr = "20180502160645"; // 定义输入日期的格式:yyyyMMddHHmmss DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); // 解析字符串为LocalDateTime对象 LocalDateTime dateTime = LocalDateTime.parse(inputDateStr, inputFormatter); // 定义目标输出格式:yyyy-MM-dd'T'HH:mm:ssZ DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); // 由于目标格式包含时区偏移(Z),需要将LocalDateTime转为带时区的ZonedDateTime // 这里使用系统默认时区,你也可以指定具体时区,比如ZoneId.of("UTC") String formattedDate = dateTime.atZone(ZoneId.systemDefault()).format(outputFormatter); System.out.println(formattedDate); // 输出类似:2018-05-02T16:06:45+0800 } }
方案二:使用传统的SimpleDateFormat(兼容旧Java版本)
如果你还在使用Java 8之前的版本,可以用这个方案,但要注意SimpleDateFormat是线程不安全的,不要在多线程环境下共享实例:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class OldDateConverter { public static void main(String[] args) throws ParseException { String inputDateStr = "20180502160645"; // 第一步:用输入格式解析字符串为Date对象 SimpleDateFormat inputParser = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = inputParser.parse(inputDateStr); // 第二步:用目标格式格式化Date对象为字符串 SimpleDateFormat outputFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); String formattedDate = outputFormatter.format(date); System.out.println(formattedDate); // 输出类似:2018-05-02T16:06:45+0800 } }
关键注意点
- 解析时的格式必须和输入字符串的格式完全匹配,包括位数、分隔符(这里输入没有分隔符,所以格式里也不能有)。
- 目标格式中的
Z代表时区偏移(比如+0800),如果不需要时区,可以去掉Z,或者用不带时区的日期类型直接格式化(此时格式里不能有Z)。
内容的提问来源于stack exchange,提问作者Uzair Khan
相关产品推荐
相关产品推荐

