Simpledateformate时区未转换

时间:2019-01-20 13:30:59

标签: java datetime simpledateformat

在java simpledateformat中,我无法转换为IST的时区。我输入的是UTC,但我想转换为IST。

        SimpleDateFormat format1 = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = format1.parse("20-01-2019 13:24:56");
        TimeZone istTimeZone = TimeZone.getTimeZone("Asia/Kolkata");
        format2.setTimeZone(istTimeZone);
        String destDate = format2.format(date);
        System.out.println(destDate); //2019-01-20 13:24:56

但是它必须加+5:30才能成为IST。

2 个答案:

答案 0 :(得分:4)

如另一个答案中所述,您没有为format1设置时区。从java8开始,您还可以使用java.time包解决此问题。

由于20-01-2019 13:24:56不包含时区信息,因此您可以:

  1. 将其解析为LocalDateTime
  2. 在UTC中将LocalDateTime转换为ZonedDateTime
  3. 在时区IST上获得相同的时刻。

示例:

DateTimeFormatter format1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

ZonedDateTime zonedDateTime = LocalDateTime
        .parse("20-01-2019 13:24:56", format1) // parse it without time zone
        .atZone(ZoneId.of("UTC")) // set time zone to UTC
        .withZoneSameInstant(ZoneId.of("Asia/Kolkata")); // convert UTC time to IST time

System.out.println(format2.format(zonedDateTime)); //2019-01-20 18:54:56

答案 1 :(得分:2)

我向代码中的format1添加了时区输出和显式UTC时区分配:

    SimpleDateFormat format1 = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
    SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println(format1.getTimeZone());
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    format1.setTimeZone(utcTimeZone);
    Date date = format1.parse("20-01-2019 13:24:56");
    TimeZone istTimeZone = TimeZone.getTimeZone("Asia/Kolkata");
    format2.setTimeZone(istTimeZone);
    String destDate = format2.format(date);
    System.out.println(destDate); // 2019-01-20 13:24:56

您应该看到SimpleDateFormat默认为本地时区。显式设置UTC应该可以。