IST 到 UTC 的转换 java

IST to UTC conversion in java

我正在尝试将收到的日期时间字符串(IST 格式)转换为 UTC 格式。

String time = 124200;
String date = 05/09/21;
DateTimeFormatter parser = DateTimeFormatter.ofPattern("dd/MM/yyHHmmss").withZone(ZoneId.of("UTC")); 
String dateInString = date.concat(time);
ZonedDateTime dateTime = ZonedDateTime.parse(dateInString, parser);
return Timestamp.valueOf(dateTime.toLocalDateTime()).toString();

此代码段未转换为 UTC。请告诉我问题是什么

长话短说:您的解析时间被视为 UTC,因为您首先附加了 ZoneId.of("UTC")。这意味着您在那天的那个时间就好像它是在 UTC.

中记录的一样

相反,您应该使用 IST 作为原始区域:

public static void main(String[] args) {
    // time and date in IST (?)
    String time = "124200";
    String date = "05/09/21";
    // two parsers, one for date and one for time
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uu");
    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmss");
    // parse the date and time using the parsers
    LocalDate localDate = LocalDate.parse(date, dateFormatter);
    LocalTime localTime = LocalTime.parse(time, timeFormatter);
    
    /*
     * until here, there's just date and time, NO zone!
     * If you apply UTC here, the parsed date and time would be regarded as UTC!
     */
    
    // create a ZonedDateTime with the desired SOURCE zone from the date and time
    ZonedDateTime istTime = ZonedDateTime.of(localDate, localTime, ZoneId.of("Asia/Kolkata"));
    // then convert it to UTC
    ZonedDateTime utcTime = istTime.withZoneSameInstant(ZoneId.of("UTC"));
    // print the results in order to view the difference
    System.out.println(istTime);
    System.out.println(utcTime);
}

此代码片段(隐式使用 ZonedDateTime.toString())的输出是

2021-09-05T12:42+05:30[Asia/Kolkata]
2021-09-05T07:12Z[UTC]

如果你的系统有 IST 作为它的默认区域,你可以写 ZoneId.systemDefault() 而不是 ZoneId.of("Asia/Kolkata"),但我必须使用明确的区域我的机器,我在欧洲