【问题标题】:How to get local time of different time zones?如何获取不同时区的当地时间?
【发布时间】:2012-02-27 16:40:03
【问题描述】:

我想使用 Java 代码获取不同时区的当地时间。根据传递给函数的时区,我需要该时区的本地时间。如何做到这一点?

【问题讨论】:

    标签: java timezone


    【解决方案1】:
    java.util.TimeZone tz = java.util.TimeZone.getTimeZone("GMT+1");
    java.util.Calendar c = java.util.Calendar.getInstance(tz);
    
    System.out.println(c.get(java.util.Calendar.HOUR_OF_DAY)+":"+c.get(java.util.Calendar.MINUTE)+":"+c.get(java.util.Calendar.SECOND));
    

    【讨论】:

    • 这段代码对我来说失败了,所以我使用了 cal.add(Calendar.MILLISECOND, rawOffset) 并自己进行了需要的时区计算,以使其独立于时区 ID。请参阅@Subhamay 答案。
    【解决方案2】:

    我建议您查看 Joda Time,它是标准 Java 日期和时间 API 的替代方案(但非常流行):

    http://joda-time.sourceforge.net/index.html

    使用 Joda Time,我认为这就是你要做什么:

    import org.joda.time.DateTime;
    import org.joda.time.DateTimeZone;
    
    public class TimeZoneDemo {
    
      public static void main(String[] args) {
    
        DateTime now = new DateTime(System.currentTimeMillis(), DateTimeZone.forID("UTC"));
        System.out.println("Current time is: " + now);
      }
    }
    

    您只需要知道相关时区的标准 ID,例如 UTC。

    【讨论】:

    • 感谢您的回复。我正在写一个小班,我不想为这个小班导入 joda 包。你能建议任何其他方式吗?再次感谢
    【解决方案3】:

    Java 1.8 在包java.time 中为您提供了一些新类:

    package learning.java8;
    
    import java.time.Instant;
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    import java.time.format.DateTimeFormatter;
    
    import org.junit.Test;
    
    public class JavaTimeLT {
    
        @Test
        public void zonedDataTimeExample() {
            final ZoneId zoneId = ZoneId.of("Europe/Zurich");
            final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.now(), zoneId);
            System.out.println(zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
        }
    }
    

    【讨论】:

      【解决方案4】:

      我编写了以下程序来获取所有可用时区的时间,看看这是否有帮助...

      String[] zoneIds = TimeZone.getAvailableIDs();
          for (int i = 0; i < zoneIds.length; i++) {
          TimeZone tz = TimeZone.getTimeZone(zoneIds[i]);
          System.out.print(tz.getID() + " " + tz.getDisplayName());
              Calendar calTZ = new GregorianCalendar(tz);
              calTZ.setTimeInMillis(new Date().getTime());
              Calendar cal = Calendar.getInstance();
              cal.set(Calendar.YEAR, calTZ.get(Calendar.YEAR));
              cal.set(Calendar.MONTH, calTZ.get(Calendar.MONTH));
              cal.set(Calendar.DAY_OF_MONTH, calTZ.get(Calendar.DAY_OF_MONTH));
              cal.set(Calendar.HOUR_OF_DAY, calTZ.get(Calendar.HOUR_OF_DAY));
              cal.set(Calendar.MINUTE, calTZ.get(Calendar.MINUTE));
              cal.set(Calendar.SECOND, calTZ.get(Calendar.SECOND));
              cal.set(Calendar.MILLISECOND, calTZ.get(Calendar.MILLISECOND));
          System.out.println( "  "+cal.getTime());
      

      【讨论】:

        【解决方案5】:

        检查一下。希望它会有所帮助。

            TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
            Calendar cal = Calendar.getInstance();
        
            int LocalOffSethrs = (int) ((cal.getTimeZone().getRawOffset()) *(2.77777778 /10000000));
        
            int ChinaOffSethrs = (int) ((tz.getRawOffset()) *(2.77777778 /10000000));
        
            TimeZone tz1 = TimeZone.getTimeZone("US/Central");
            String ss =cal.getTimeZone().getDisplayName();
        
            System.out.println("Local Time Zone : " + ss);
            System.out.println("China Time : " + tz.getRawOffset());
        
            System.out.println("Local Offset Time from GMT: " + LocalOffSethrs);
            System.out.println("China Offset Time from GMT: " + ChinaOffSethrs);
        
            cal.add(Calendar.MILLISECOND,-(cal.getTimeZone().getRawOffset()));
            //cal.add(Calendar.HOUR,- LocalOffSethrs);
        
            cal.add(Calendar.MILLISECOND, tz.getRawOffset());
            Date dt = new Date(cal.getTimeInMillis());                  
            System.out.println("After adjusting offset Acctual China Time :" + dt);
        

        【讨论】:

          【解决方案6】:

          在 Java 8 中,您可以使用ZonedDateTime.now(ZoneId zone) 方法:

          ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
          LocalTime localTime = zonedDateTime.toLocalTime();
          
          System.out.println(localTime);
          

          【讨论】:

            【解决方案7】:
            import java.text.SimpleDateFormat;
            import java.util.GregorianCalendar;
            
            SimpleDateFormat dateFormat = new SimpleDateFormat();
            dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));
            GregorianCalendar cal = Calendar.getInstance();
            cal.add(Calendar.DATE, 0);
            
            System.out.println(dateFormat.format( cal.getTime()));
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-03-21
              • 1970-01-01
              • 1970-01-01
              • 2015-08-30
              • 1970-01-01
              • 2013-03-24
              • 2011-12-19
              相关资源
              最近更新 更多