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



我已经为我的Calendar实例这样做了,以返回UTC时区的Date:

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对象。

任何帮助将非常感激!

你可以这样做:

 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));

它会给出:
当地时间:Fri Jun 21 11:55:00 UTC 2013
格林尼治时间:21/06/2013:11:55:00

我希望这对你有帮助。

欢呼。

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

这是来自javadoc:

尽管Date类旨在反映协调世界时(UTC),但它可能不会准确地这样做,这取决于Java虚拟机的主机环境。

与其在多个地方设置TimeZone,不如使用-Duser设置TimeZone。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

关于为什么Date对象取当前时区值的好解释,

请参考这个SO答案

编辑。


我将在这里添加一些重要的部分。


java.util。Date is没有特定的时区,尽管它的值通常被认为与UTC有关。你怎么知道是当地时间?

确切地说:java.util.Date中的值是自Unix纪元(1970年1月1日午夜,UTC)以来的毫秒数。同样的纪元也可以用其他时区来描述,但传统的描述是用UTC来描述的。因为它是从固定纪元开始的毫秒数,所以java.util.Date中的值在世界各地的任何特定时刻都是相同的,而与当地时区无关。

相关内容

  • 没有找到相关文章

最新更新