Java中如何将Oracle数据库的ET时间Timestamp转换为UTC时间
解决Oracle ET时间转UTC的Java时区转换问题
我来帮你搞定这个时区转换的问题!你的代码里有几个关键问题导致转换失败,咱们一步步来梳理和修复。
你的代码里的核心问题
过时的
Date构造器陷阱new Date(2019,10,19,00,51,00)这个构造器早已被标记为过时,而且它的月份参数是从0开始计数的——传入10实际对应的是11月,这直接导致你初始化的时间对象从根源上就错了。时区关联逻辑缺失
Date对象本质上只是一个UTC时间戳,本身不携带时区信息。你直接给SimpleDateFormat设置GMT时区,但并没有告诉它“原始时间是ET时区的”,所以代码只是把系统时区下的错误时间转成了GMT,结果自然不符合预期。
推荐方案:使用Java 8+现代日期时间API(java.time包)
官方推荐的java.time包解决了旧API的所有痛点(线程不安全、时区处理混乱等),是处理日期时间的首选方案。以下是正确实现代码:
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class TimeZoneConverter { public static void main(String[] args) { // 数据库中存储的ET时间字符串 String etTimeStr = "19-Oct-19 00:51 AM"; // 定义匹配ET时间格式的解析器 DateTimeFormatter etFormatter = DateTimeFormatter.ofPattern("dd-MMM-yy hh:mm a"); // 1. 将字符串解析为ET时区的时间对象(America/New_York会自动处理夏令时切换) ZonedDateTime etDateTime = LocalDateTime.parse(etTimeStr, etFormatter) .atZone(ZoneId.of("America/New_York")); // 2. 转换为UTC时间(保持时间点不变,仅切换时区视角) ZonedDateTime utcDateTime = etDateTime.withZoneSameInstant(ZoneId.of("UTC")); // 3. 格式化输出预期的UTC时间格式 DateTimeFormatter utcFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"); System.out.println(utcFormatter.format(utcDateTime)); // 输出:10/19/2019 04:51 AM } }
兼容旧API的解决方案(如果必须使用Date/SimpleDateFormat)
如果受限于项目环境无法使用新API,修正后的旧API代码如下:
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class OldTimeZoneConverter { public static void main(String[] args) throws ParseException { String etTimeStr = "19-Oct-19 00:51 AM"; // 第一步:用ET时区解析原始时间字符串 DateFormat etParser = new SimpleDateFormat("dd-MMM-yy hh:mm a"); etParser.setTimeZone(TimeZone.getTimeZone("America/New_York")); Date etDate = etParser.parse(etTimeStr); // 第二步:用UTC时区格式化输出时间 DateFormat utcFormatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a"); utcFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); System.out.println(utcFormatter.format(etDate)); // 输出:10/19/2019 04:51 AM } }
关键注意事项
- 务必先将原始时间关联到ET时区,再转换为UTC,不能跳过时区绑定步骤。
- 使用
America/New_York作为时区ID而非EST/EDT,因为它会自动处理夏令时与标准时间的切换,适配不同日期的时区规则。
内容的提问来源于stack exchange,提问作者user10265145
相关产品推荐
相关产品推荐

