0

我收到了格式为“yyyy-MM-dd'T'HH:mm:ssXXX”的字符串

例如“2020-06-01T11:04:02+02:00”

我想把它转换成“yyyy-MM-dd'T'HH:mm:ss:SSSZ”

例如“2020-06-01T11:04:02.000+0200”

我实际上不知道时区。它应该从字符串的最后一部分中提取。

我已经尝试过了,但是当我将字符串转换为日期(即 IST)时,它占用了我的本地时间和时区。

        SimpleDateFormat sd1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
        //sd1.setTimeZone(TimeZone.getTimeZone("PST"));
        Date dt = sd1.parse("2020-06-01T11:04:02+02:00");
        SimpleDateFormat sd2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSSZ");
        System.out.println(sd2.format(dt));

输出:

2020-06-01T14:34:02:000+0530

只有日期是正确的,时间和时区已经改变。

我知道我做错了,如果有人能告诉我该怎么做,那将非常有帮助。谢谢您的帮助。

4

3 回答 3

9
于 2020-06-05T22:42:34.220 回答
4

我要给你的第一个建议是从使用 Date 对象切换到 LocalDateTime (java 8+)

使用新的 API 将以这种方式工作

String YOUR_DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YOUR_DATE_TIME_PATTERN);
LocalDateTime dateTime = LocalDateTime.parse(input_date, formatter);

//Then you can set your timezone in this way - remember to replace the values with the proper timezone you want. 



ZonedDateTime zonedUTC = dateTime.atZone(ZoneId.of("UTC"));

ZonedDateTime zonedIST = zonedUTC.withZoneSameInstant(ZoneId.of("Asia/Kolkata"));

让我知道这是否适合你

于 2020-06-05T17:38:26.487 回答
2

要详细说明评论并了解@Daniel Vilas-Boas 的答案,您应该选择Java8,我认为您想要的是:

public static void main(String[] args) {
    String YOUR_DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX";
    String YOUR_NEW_DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss:SSSZ";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YOUR_DATE_TIME_PATTERN);
    DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern(YOUR_NEW_DATE_TIME_PATTERN);
    ZonedDateTime zonedDateTime = ZonedDateTime.parse("2020-06-01T11:04:02+02:00", formatter);

    ZoneId from = ZoneId.from(zonedDateTime);
    System.out.println(from);

    ZonedDateTime zonedIST = zonedDateTime.withZoneSameInstant(ZoneId.of("Asia/Kolkata"));

    System.out.println(zonedDateTime.format(newFormatter));
    System.out.println(zonedIST.format(newFormatter));
}

prints应该打印:

2020-06-01T11:04:02:000+0000
2020-06-01T16:34:02:000+0530

编辑

包括ZoneId允许处理不同的时区。

于 2020-06-05T18:18:59.883 回答