使用java将当前GMT时间转换为CST时区

时间:2018-03-28 11:00:20

标签: java date calendar simpledateformat

我正在尝试使用JDK8将当前GMT时间转换为CST时间。但是我的代码总是为两个时区返回相同的时间。我还验证了getAvailableIDs()有" CST"。

                Calendar cal = Calendar.getInstance();
            TimeZone timeZone = TimeZone.getTimeZone("GMT");
            cal.setTimeZone(timeZone);

            // System.out.println("GMT time = " + cal.getTime());

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            sdf.setTimeZone(timeZone);
            String gmtDateStr = sdf.format(cal.getTime());
            System.out.println("Formatted GMT time = " + gmtDateStr);

            // To CST
            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            TimeZone cst = TimeZone.getTimeZone("CST");
            sdf2.setTimeZone(cst);
            Date cstDate = sdf2.parse(gmtDateStr);

            // System.out.println("PARSED CST DATE = " + cstDate);

            Calendar cal2 = new GregorianCalendar();
            cal2.setTime(cstDate);
            cal2.setTimeZone(cst);
            String cstDateStr = sdf2.format(cal2.getTime());

            // System.out.println("cal2 time = " + cal2.getTime());
            System.out.println("FORMATTED CST DATE = " + cstDateStr);

这里有什么问题?任何人都可以给我一个答案吗?

3 个答案:

答案 0 :(得分:3)

您无需执行所有此转换即可在首选时区获得时间。您可以简单地关注..

        Calendar cal = Calendar.getInstance();
        TimeZone timeZone = TimeZone.getTimeZone("GMT");
        cal.setTimeZone(timeZone);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(timeZone);
        String gmtDateStr = sdf.format(cal.getTime());
        System.out.println("Formatted GMT time = " + gmtDateStr);

        // To CST
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        TimeZone cst = TimeZone.getTimeZone("CST");
        sdf2.setTimeZone(cst);

        System.out.println("FORMATTED CST DATE = " + sdf2.format(cal.getTime()));

答案 1 :(得分:3)

Java 8 java.time找不到由CST标识的区域

ZoneId cst = ZoneId.of("CST");

结果为java.time.zone.ZoneRulesException: Unknown time-zone ID: CST。这是有道理的,因为北美有中央标准时间,中国标准时间,可能还有其他。

如果您指的是北美的中央标准时间,由America/Chicago表示:

ZoneId gmt = ZoneId.of("GMT");
ZoneId cst = ZoneId.of("America/Chicago");
ZonedDateTime gmtTime = ZonedDateTime.now(gmt);
ZonedDateTime cstTime = gmtTime.withZoneSameInstant(cst);

答案 2 :(得分:2)

您的代码出现的问题是对Calendar.getTime()的所有调用。这将返回Date实例,并且这些对象不具有时区的概念。因此,在Calendar个实例中设置时区是没用的,因为您在转换为Date时会丢弃该信息。

只需在格式化程序中指定时区,就像在Yogesh Badke的回答中一样。

相关问题