java 中从 SGT 到 UTC 的时间转换在 12:35:42 不起作用 [重复]

Time Conversion in java from SGT to UTC not working for 12:35:42 [duplicate]

提问人:Varun Yadav 提问时间:2/9/2023 最后编辑:AnonymousVarun Yadav 更新时间:2/9/2023 访问量:241

问:

尝试将新加坡时间转换为 UTc,并需要OffsetDateTime中的结果。下面的代码适用于我的所有场景,除了一个用于 12:35 的场景.....中午 12:00 不知何故给出了错误的结果。应该在 2 月 8 日早上 04:35 给,而是给 2 月 7 日 16:35。 有什么办法可以解决它

代码片段如下

    if (dbTime == null) {
        return null;
    }
    SimpleDateFormat dateTimeFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    dateTimeFormatter.setTimeZone(TimeZone.getTimeZone(ZoneId.of("Asia/Singapore")));
    Instant instant = null;
    try {
        dateTimeFormatter.parse(dbTime);
        instant = dateTimeFormatter.parse(dbTime).toInstant();
    } catch (ParseException e) {
        LOGGER.warn("Could not parse ({}) to valid DateTime ", dbTime, e);
        return null;
    }
    OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.UTC);
    return offsetDateTime;
}

@Test
void canConvertSGTToUTC() {
    String sqlDate = "2023-02-08 12:35:45.0";
    var result = dateParser.parseToOffsetDateTime(sqlDate);
    assertEquals( "2023-02-08T04:35:45Z", result.toString());
}

SGT 或亚洲/新加坡是服务器的本地系统时间。

java-8 时区 datetime-parsesing datetime-conversion

评论

2赞 Anonymous 2/9/2023
请立即停止使用。这是一个臭名昭著的麻烦制造者,幸运的是早已过时了。你已经从java.time得到了现代Java日期和时间API,你可以把它传递给其他现代类并解析其他现代类的方法。SimpleDateFormatDateTimeFormatterLocalDateTime.parse)CharSequence, DateTimeFormatter)
2赞 Anonymous 2/9/2023
如果表示日期和时间来自 SQL 数据库,则不要将它们作为 from where 检索。检索一个,使自己免于解析。例如,请看我的答案。dbTimeStringLocalDateTime
1赞 Anonymous 2/9/2023
对于您未来的问题(无论是在 Stack Overflow 上还是在其他地方),我建议您学习如何创建一个最小的可重现示例。我相信你问的解析错误可以在大约三行代码中得到证明,所以如果可以的话,不要发布更多。

答:

0赞 Avanika Agarwal 2/9/2023 #1

使用“HH:mm:ss”格式,其中“H”是 24 小时格式。 “h”是 12 小时格式。应该解决你的问题

评论

0赞 Anonymous 2/9/2023
这是正确的,正如我在您发布答案后链接到的原始问题中所述。