如何使用SimpleDateFormat将UTC日期字符串转为UTC格式Date对象
核心认知纠正
java.util.Date本身不携带任何时区、格式属性,本质是对long类型毫秒时间戳的包装,存储的是从1970-01-01 00:00:00 UTC到对应时刻的毫秒偏移量,不存在「GMT格式Date对象」「UTC格式Date对象」的区别。
直接打印Date对象时看到带GMT字样的输出,是Date.toString()方法的默认逻辑:该方法会自动读取JVM当前默认时区,把内部存储的时间戳转成对应时区的可读字符串返回,这个输出效果不代表Date对象内部存储的是GMT时间。你之前写的解析代码逻辑正确,解析得到的Date时间值完全准确,不存在格式转换错误的问题。
可通过打印时间戳直接验证解析结果准确性:
System.out.println(date.getTime());
只要输出的毫秒值和UTC时间2022-06-27 08:27:00对应的毫秒数一致,就说明解析结果完全可用。
获取UTC格式时间字符串的实现
如果需要得到2022-06-27 08:27:00 UTC样式的时间文本,不需要修改Date对象,直接复用之前配置好的、设置了UTC时区的SimpleDateFormat调用format方法即可:
String newDateString = "2022-06-27 08:27:00 UTC"; DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss 'UTC'"); format.setTimeZone(TimeZone.getTimeZone("UTC")); Date date = format.parse(newDateString); // 格式化输出UTC格式字符串 String utcTimeStr = format.format(date); System.out.println(utcTimeStr); // 输出:2022-06-27 08:27:00 UTC
注意事项
- 不要尝试修改Date对象本身实现指定格式输出,Date不存储格式、时区信息,所有时间文本的解析、格式化都需要通过DateFormat类完成
- 原有解析逻辑不需要改动,只要解析阶段给SimpleDateFormat设置了UTC时区,得到的Date时间值就是准确的
- SimpleDateFormat的时区配置仅在字符串解析、字符串格式化两个环节生效,不会改动Date对象内部存储的时间戳
内容的提问来源于stack exchange,提问作者Muahmmad Tayyib
相关产品推荐
相关产品推荐

