如何动态获取系统的最新时区?

时间:2015-06-09 04:45:45

标签: java multithreading

运行此应用程序后,如果我正在更改正在运行的应用程序之间的时区,那么calendar.getTimeZone()仍然没有获得最新的时区,而是显示时区的内容。运行应用程序的时间:

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class Test implements Runnable {

public static void main(String[] args) throws InterruptedException {
    System.out.println("starting");
    Thread.sleep(10000);
    new Thread(new Test()).start();
    Thread.sleep(5000);
    new Thread(new Test()).start();
    Thread.sleep(5000);
    new Thread(new Test()).start();
    Thread.sleep(5000);
    new Thread(new Test()).start();
    Thread.sleep(5000);
    new Thread(new Test()).start();
    Thread.sleep(5000);
    new Thread(new Test()).start();
    }

@Override
public void run() {

    Calendar calendar = new GregorianCalendar();
    TimeZone t=calendar.getTimeZone();
    System.out.println("from run:"+t.getID());
}
}

1 个答案:

答案 0 :(得分:3)

默认情况下,时区仅设置为JVM启动。如果在应用程序执行期间更改了OS时区,则不会自动将其转发到JVM。但是你可以强制重新读取当前时区。

以下示例仅在Windows环境中进行了测试。

  1. 启动TestTimeZone
  2. 执行期间
  3. Control Panel\Clock, Language, and Region - change the time zone
  4. 更改Windows时区

    import java.util.TimeZone;
    import java.util.concurrent.TimeUnit;
    
    public class TestTimeZone implements Runnable {
    
        public static void main(String[] args) throws Exception {
            System.out.println("starting");
            for (int i = 0; i < 10; i++) {
                new Thread(new TestTimeZone()).start();
                TimeUnit.SECONDS.sleep(5);
            }
        }
    
        @Override
        public void run() {
            TimeZone.setDefault(null);
            System.setProperty("user.timezone", "");
            System.out.println("current OS timezone: " + TimeZone.getDefault().getID());
        }
    }
    

    示例输出

    current OS timezone    : Europe/Berlin
    current OS timezone    : Africa/Windhoek
    current OS timezone    : Europe/Helsinki
    current OS timezone    : GMT
    ...
    

    编辑以上代码也适用于Linux(以下是在Debian,CentOS上测试的步骤)。

    在执行TestTimeZone期间,执行为root(在单个步骤之间执行一段短暂的延迟)。

    $ timedatectl set-timezone Europe/Berlin
    $ timedatectl set-timezone Africa/Windhoek
    $ timedatectl set-timezone Europe/Helsinki
    $ timedatectl set-timezone GMT
    

    注意在更改时区之前,请记下您的当前时间。

    $ cat /etc/timezone