从SQL datetimeoffset获取时区偏移及转换本地时间的Java问题
解决方法
问题根源
你的DateTimeFormatter格式与输入字符串不匹配,导致解析失败:
- 输入中日期和时间之间是空格,但格式里写的是
'T' - 毫秒部分是7位小数(
.0000000),格式里用的SSS只能识别3位,且分隔符是.而非: - 时区偏移是
-04:00这种格式,应该用XXX匹配,而不是z(z用于时区名称如UTC、EST)
修正后的代码
import java.time.OffsetDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { // 匹配输入字符串的格式:日期空格时间,7位毫秒,带符号的时区偏移 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS XXX"); String dateString = "2024-07-16 22:30:00.0000000 -04:00"; // 解析为OffsetDateTime(更适合处理固定时区偏移的场景) OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateString, formatter); // 获取时区偏移的小时数 ZoneOffset offset = offsetDateTime.getOffset(); int offsetHours = offset.getTotalSeconds() / 3600; System.out.println("时区偏移小时数:" + offsetHours); // 转换为用户本地时间 OffsetDateTime localDateTime = offsetDateTime.atZoneSameInstant(ZoneId.systemDefault()).toOffsetDateTime(); System.out.println("本地时间:" + localDateTime.format(formatter)); // 转换为UTC时间(可选) OffsetDateTime utcDateTime = offsetDateTime.withOffsetSameInstant(ZoneOffset.UTC); System.out.println("UTC时间:" + utcDateTime.format(formatter)); } }
关键说明
- 使用
OffsetDateTime替代ZonedDateTime:SQL Server的datetimeoffset存储的是固定时区偏移,而非带规则的时区(如夏令时),OffsetDateTime更贴合这个场景 - 格式字符串中的
SSSSSSS对应7位毫秒,XXX匹配±HH:mm格式的时区偏移 - 通过
getOffset().getTotalSeconds() / 3600直接获取偏移小时数 - 转换本地时间时,
ZoneId.systemDefault()会自动获取当前JVM的默认时区
内容的提问来源于stack exchange,提问作者Kung Fu Ninja
相关产品推荐
相关产品推荐

