如果定义了TimeZone,则Calendar.getTime()不返回UTC日期

时间:2013-06-21 11:15:39

标签: java datetime calendar timezone

我为我的Calendar实例做了这个,以UTC时区返回日期:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:SS Z");
TimeZone tz = TimeZoneUtil.getTimeZone(StringPool.UTC);
formatter.setTimeZone(tz);

    Date dtStart = null;
    Date dtEnd = null;

    try{
        dtStart = formatter.parse(formatter.format(startDate.getTime()));
        dtEnd = formatter.parse(formatter.format(endDate.getTime()));
    }catch (Exception e) {
        e.getStackTrace();
}

它工作正常,直到我格式化日历时间戳以返回带有所需时区的字符串日期,但是当我将该字符串日期解析为日期日期时,它会再次选择本地时区? 我需要以UTC时区存储Date对象。

任何帮助都将受到高度赞赏!

4 个答案:

答案 0 :(得分:7)

您可以使用:

 Date localTime = new Date(); 

 //creating DateFormat for converting time from local timezone to GMT
 DateFormat converter = new SimpleDateFormat("dd/MM/yyyy:HH:mm:ss");

 //getting GMT timezone, you can get any timezone e.g. UTC
 converter.setTimeZone(TimeZone.getTimeZone("GMT"));

 System.out.println("local time : " + localTime);;
 System.out.println("time in GMT : " + converter.format(localTime));

它会给出:
当地时间:星期五6月21日11:55:00 UTC 2013
格林威治标准时间: 21/06/2013:11:55:00

我希望它会有所帮助。

干杯。

答案 1 :(得分:0)

java中的日期对象将始终将值存储在主机(您的系统)时区信息中。

这是来自javadoc:

虽然Date类旨在反映协调世界时(UTC),但它可能不会完全这样做,具体取决于Java虚拟机的主机环境。

您应该尝试使用非常先进的Joda Time

答案 2 :(得分:0)

不要在多个地方设置TimeZone,最好使用-Duser.timezone = GMT或PST设置时区。

而且,您可以轻松测试Java如何处理时区,而getTime()会忽略时区,并附带一个实际示例:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); // print with timezone


        TimeZone timeZone = TimeZone.getTimeZone(ZoneId.of("GMT"));
        TimeZone.setDefault(timeZone);          // set system timezone as GMT
        sdf.setTimeZone(timeZone);              // formatter also has a timezone
        Date date = new Date();
        System.out.println(date);               // system says GMT date
        System.out.println(date.getTime());     // only prints time in milliseconds after January 1, 1970 00:00:00 GMT
        System.out.println(sdf.format(date));

        timeZone = TimeZone.getTimeZone(ZoneId.of("America/Los_Angeles"));
        TimeZone.setDefault(timeZone);          // set system timezone as GMT
        sdf.setTimeZone(timeZone);              // formatter also has a timezone
        date = new Date();
        System.out.println(date);
        System.out.println(date.getTime());     // prints the same value as above, "not including timezone offset"
        System.out.println(sdf.format(date));

        // GMT and PDT times are same as getTime() only returns time in ms since UTC for the day ignoring timezone which is mostly used for formatting

Wed Mar 14 22:43:43 GMT 2018
1521067423108
2018-03-14T22:43:43+0000

Wed Mar 14 15:43:43 PDT 2018
1521067423125                  // not includes timezone in getTime()
2018-03-14T15:43:43-0700       // formatting looks fine

答案 3 :(得分:-1)

为什么Date对象采用当前时区值

的详细解释

请参阅此SO answer

EDIT。


在这里,我将添加一些重要的答案。


java.util.Date没有特定的时区,尽管其值通常与UTC相关。是什么让你觉得它是在当地时间?

准确地说:java.util.Date中的值是自1970年1月1日午夜发布的Unix纪元以来的毫秒数。同一时期也可以在其他时区描述,但传统的描述是以UTC的形式。由于它是固定时期以来的毫秒数,因此无论当地时区如何,java.util.Date中的值在任何特定时刻都是相同的。