Java中将dd-MM-yyyy字符串转换为ISO 8601 DateTime格式的实现问题
日期转换实现方案
原代码错误点
new DateTime(String)方法无法识别dd-MM-yyyy格式的输入,会直接抛出格式异常SimpleDateFormat的parse()入参仅支持字符串类型,不能直接传入DateTime实例- 目标格式的
Z代表UTC时区,未显式指定时区会引入系统默认时区偏移,导致时间错误 - 时间类型本身无格式属性,格式仅用于字符串和时间类型的互相转换,不需要对时间对象做二次解析
正确实现
方案1:适配Joda Time DateTime类
你代码中用到的DateTime属于Joda Time库,对应实现如下:
import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; public class DateConvert { public static void main(String[] args) { String toDateString= "15-08-2021"; // 定义输入格式解析器,指定UTC时区 DateTimeFormatter inputFormatter = DateTimeFormat.forPattern("dd-MM-yyyy").withZoneUTC(); // 解析得到DateTime对象 DateTime dateTime = inputFormatter.parseDateTime(toDateString); // 定义目标输出格式 DateTimeFormatter outputFormatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"); // 如需格式化后的字符串,直接打印即可 String formatResult = outputFormatter.print(dateTime); System.out.println(formatResult); // 输出 2021-08-15T00:00:00Z // 如需DateTime类型数据,直接使用上面得到的dateTime即可 } }
方案2:Java 8+ 官方标准库实现(推荐)
Joda Time官方已建议迁移到Java 8及以上版本内置的java.time标准库,实现如下:
import java.time.LocalDate; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DateConvert { public static void main(String[] args) { String toDateString= "15-08-2021"; // 解析输入日期字符串 LocalDate localDate = LocalDate.parse(toDateString, DateTimeFormatter.ofPattern("dd-MM-yyyy")); // 补全UTC时区0点时间,得到带时区的时间对象 ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneOffset.UTC); // 定义目标格式 DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"); // 格式化得到字符串 String formatResult = zonedDateTime.format(targetFormatter); System.out.println(formatResult); // 输出 2021-08-15T00:00:00Z // 如需时间类型数据,直接使用zonedDateTime即可 } }
内容的提问来源于stack exchange,提问作者madhu
相关产品推荐
相关产品推荐

