【问题标题】:Calendar.getInstance(TimeZone.getTimeZone("UTC")) is not returning UTC timeCalendar.getInstance(TimeZone.getTimeZone("UTC")) 未返回 UTC 时间
【发布时间】:2014-02-16 10:32:10
【问题描述】:

我对 Calendar.getInstance(TimeZone.getTimeZone("UTC")) 方法调用得到的结果感到非常困惑,它正在返回 IST 时间。

这是我使用的代码

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

我得到的回应是:

Sat Jan 25 15:44:18 IST 2014

所以我尝试将默认时区更改为 UTC,然后我检查,然后它工作正常

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

TimeZone tz  = TimeZone.getDefault() ;
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());
TimeZone.setDefault(tz);

结果:

Sat Jan 25 16:09:11 IST 2014
Sat Jan 25 10:39:11 UTC 2014

我错过了什么吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    System.out.println(cal_Two.getTime()) 调用从getTime() 返回一个Date。将 Date 转换为 println 的字符串,在您的情况下,该转换将使用默认的 IST 时区。

    您需要显式使用DateFormat.setTimeZone() 在所需时区打印Date

    编辑:感谢@Laurynas,请考虑一下:

    TimeZone timeZone = TimeZone.getTimeZone("UTC");
    Calendar calendar = Calendar.getInstance(timeZone);
    SimpleDateFormat simpleDateFormat = 
           new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US);
    simpleDateFormat.setTimeZone(timeZone);
    
    System.out.println("Time zone: " + timeZone.getID());
    System.out.println("default time zone: " + TimeZone.getDefault().getID());
    System.out.println();
    
    System.out.println("UTC:     " + simpleDateFormat.format(calendar.getTime()));
    System.out.println("Default: " + calendar.getTime());
    

    【讨论】:

    • 我一直在寻找这个。也许标题不够明确?顺便说一句,谢谢你的帮助
    • 如果显示 System.out.println 的结果可以节省很多时间:)
    • 我明白了.. 谢谢.. 但我不明白如何设置时区设置是 simpleDateFormat 类的责任。更改时区会更改实际时间,而不是格式。 SimpleDateFormat 的工作只是格式化日期,而不是操纵时间......
    • 完美答案!!
    • 这(必须设置格式化程序的时区)每次都能吸引我,即使我设置了日历的时区。
    【解决方案2】:

    java.util.Date 与时区无关。当您打印 cal_Two 尽管 Calendar 实例已将其时区设置为 UTC 时,cal_Two.getTime() 将返回一个没有时区(并且始终处于默认时区)的 Date 实例

    Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    System.out.println(cal_Two.getTime());
    System.out.println(cal_Two.getTimeZone());
    

    输出:

     Sat Jan 25 16:40:28 IST 2014
        sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] 
    

    来自TimeZone.setDefault()的javadoc

    设置由 getDefault 方法返回的 TimeZone。如果区 为 null,将默认值重置为 VM 最初的值 第一次开始。

    因此,在实例化 cal_Two 之前移动您的 setDefault(),您将获得正确的结果。

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    System.out.println(cal_Two.getTime());
    
    Calendar cal_Three = Calendar.getInstance();
    System.out.println(cal_Three.getTime());
    

    输出:

    Sat Jan 25 11:15:29 UTC 2014
    Sat Jan 25 11:15:29 UTC 2014
    

    【讨论】:

      【解决方案3】:

      你肯定错过了一件小事,那就是你没有设置默认值:

      TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
      

      所以代码看起来像:

      TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
      Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
      System.out.println(cal_Two.getTime());
      

      说明:如果要更改时区,请使用TimeZone.setDefault()设置默认时区

      【讨论】:

        【解决方案4】:
        Calendar currentTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        currentTime.set(Calendar.ZONE_OFFSET, TimeZone.getTimeZone("UTC").getRawOffset());
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, currentTime.get(Calendar.HOUR_OF_DAY));
        calendar.getTimeInMillis()
        

        为我工作

        【讨论】:

          【解决方案5】:
              Following code is the simple example to change the timezone
          
          public static void main(String[] args) {
                    //get time zone
                    TimeZone timeZone1 = TimeZone.getTimeZone("Asia/Colombo");
                    Calendar calendar = new GregorianCalendar();
                    //setting required timeZone
                    calendar.setTimeZone(timeZone1);
                    System.out.println("Time :" + calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND));
          
                 }
          

          如果你想查看时区列表,这里是以下代码

          public static void main(String[] args) {
          
              String[] ids = TimeZone.getAvailableIDs();
              for (String id : ids) {
                  System.out.println(displayTimeZone(TimeZone.getTimeZone(id)));
              }
          
              System.out.println("\nTotal TimeZone ID " + ids.length);
          
          }
          
          private static String displayTimeZone(TimeZone tz) {
          
              long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset());
              long minutes = TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset())
                                        - TimeUnit.HOURS.toMinutes(hours);
              // avoid -4:-30 issue
              minutes = Math.abs(minutes);
          
              String result = "";
              if (hours > 0) {
                  result = String.format("(GMT+%d:%02d) %s", hours, minutes, tz.getID());
              } else {
                  result = String.format("(GMT%d:%02d) %s", hours, minutes, tz.getID());
              }
          
              return result;
          
          }
          

          【讨论】:

            【解决方案6】:

            它对我有用。

            获取时间戳类型:

            public static Timestamp getCurrentTimestamp() {
                TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
                final Calendar cal = Calendar.getInstance();
                Date date = cal.getTime();
                Timestamp ts = new Timestamp(date.getTime());
                return ts;
            }
            

            获取字符串类型:

                public static String getCurrentTimestamp() {
                TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
                final Calendar cal = Calendar.getInstance();
                Date date = cal.getTime();
                Timestamp ts = new Timestamp(date.getTime());
                return ts.toString();
            }
            

            【讨论】:

              【解决方案7】:

              尝试使用GMT 而不是UTC。它们指的是同一个时区,但名称 GMT 更常见并且可能有用。

              【讨论】:

              • 使用 GMT 将产生相同的结果。
              猜你喜欢
              • 1970-01-01
              • 2013-06-20
              • 2018-08-08
              • 1970-01-01
              • 1970-01-01
              • 2011-10-27
              • 2011-01-25
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多