Java实现PostgreSQL日期时间格式与指定格式互转咨询
Java中PostgreSQL日期格式与带时区格式的互转方法
一、从PostgreSQL格式(yyyy-MM-dd HH:mm:ss.SSS)转成带时区格式(EEE MMM dd HH:mm:ss zzz yyyy)
PostgreSQL返回的2022-11-28 23:36:43.712是不带时区的日期时间字符串,我们需要先将其解析为本地日期时间,再转换为目标时区(如IST对应的Asia/Kolkata)的带时区时间,最后格式化输出。
使用Java 8+的java.time API实现:
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DateConverter { public static void main(String[] args) { String pgDateTimeStr = "2022-11-28 23:36:43.712"; // 解析PostgreSQL格式字符串 LocalDateTime localDateTime = LocalDateTime.parse(pgDateTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); // 转换为IST时区(Asia/Kolkata) ZonedDateTime istDateTime = localDateTime.atZone(ZoneId.of("Asia/Kolkata")); // 格式化为目标字符串 DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy"); String targetStr = istDateTime.format(targetFormatter); System.out.println(targetStr); // 输出示例:Mon Nov 28 20:51:58 IST 2022 } }
二、从带时区格式转成PostgreSQL格式
反过来,将Mon Nov 28 20:51:58 IST 2022这类带时区的字符串解析为带时区日期时间,再转换为目标时区(如UTC)的本地日期时间,最后格式化为PostgreSQL格式。
代码实现:
import java.time.ZonedDateTime; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; public class ReverseDateConverter { public static void main(String[] args) { String istDateTimeStr = "Mon Nov 28 20:51:58 IST 2022"; // 解析带时区字符串,指定时区为Asia/Kolkata DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy"); ZonedDateTime zonedDateTime = ZonedDateTime.parse(istDateTimeStr, sourceFormatter.withZone(ZoneId.of("Asia/Kolkata"))); // 转换为UTC时区的本地日期时间 LocalDateTime utcLocalDateTime = zonedDateTime.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime(); // 格式化为PostgreSQL格式 DateTimeFormatter pgFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); String pgDateTimeStr = utcLocalDateTime.format(pgFormatter); System.out.println(pgDateTimeStr); // 输出示例:2022-11-28 23:36:43.712 } }
注意事项
- 优先使用Java 8+引入的
java.time系列API,避免旧Date、SimpleDateFormat的线程安全问题。 - 时区建议使用完整ID(如
Asia/Kolkata)而非缩写(如IST),避免缩写对应多个时区的歧义。 - 如果PostgreSQL返回的是带时区的时间类型(
timestamp with time zone),直接解析为OffsetDateTime或ZonedDateTime即可,无需先转LocalDateTime。
内容的提问来源于stack exchange,提问作者Kavishka Madhushan
相关产品推荐
相关产品推荐

