Java中如何为不带T的UTC时间戳添加T标识并增加5分钟
问题原因
- 你用到的
SimpleDateFormat默认会用JVM的本地时区做格式化,输入的是UTC时间,输出时没有指定UTC时区,就会转换为你本地时区的时间,这是输出出现12点多的核心原因 SimpleDateFormat的S标识符只代表毫秒,最多支持3位,你输入的日期带6位微秒,会被直接识别为716241毫秒叠加到时间上,进一步导致时间计算错误
推荐实现(Java 8及以上版本,使用官方java.time日期库)
java.time库是JDK8之后官方推出的日期处理工具,解决了旧版Date、SimpleDateFormat的线程安全、时区处理混乱、精度支持差等问题,实现代码如下:
import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; public class DateConvert { public static void main(String[] args) { String d = "2021-08-27 06:25:00.716241+00:00"; // 定义输入格式,匹配带微秒、时区的日期字符串 DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSXXX"); // 解析为带UTC时区的时间对象 OffsetDateTime originUtcTime = OffsetDateTime.parse(d, inputFormatter); // 定义输出格式:带T标识、精度到秒 DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); // 输出转换后的原时间字符串 String originFormatResult = originUtcTime.format(outputFormatter); System.out.println(originFormatResult); // 输出 2021-08-27T06:25:00 // 增加5分钟后格式化输出 OffsetDateTime timeAfterAdd = originUtcTime.plusMinutes(5); String addResult = timeAfterAdd.format(outputFormatter); System.out.println(addResult); // 输出 2021-08-27T06:30:00 } }
旧JDK兼容实现(仅用于JDK7及更早版本,不推荐长期使用)
如果必须使用旧的SimpleDateFormat,需要明确指定时区,避免自动转换为本地时区,代码如下:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; public class DateConvert { public static void main(String[] args) throws ParseException { String d = "2021-08-27 06:25:00.716241+00:00"; SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSXXX"); // 强制指定输入解析使用UTC时区 inputFormat.setTimeZone(TimeZone.getTimeZone("UTC")); Date originDate = inputFormat.parse(d); SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); // 强制指定输出格式化使用UTC时区 outputFormat.setTimeZone(TimeZone.getTimeZone("UTC")); String originResult = outputFormat.format(originDate); System.out.println(originResult); // 输出 2021-08-27T06:25:00 // 增加5分钟 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.setTime(originDate); calendar.add(Calendar.MINUTE, 5); String addResult = outputFormat.format(calendar.getTime()); System.out.println(addResult); // 输出 2021-08-27T06:30:00 } }
内容的提问来源于stack exchange,提问作者Sam Maul
相关产品推荐
相关产品推荐

