运行此应用程序后,如果我正在更改正在运行的应用程序之间的时区,那么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());
}
}
答案 0 :(得分:3)
默认情况下,时区仅设置为JVM启动。如果在应用程序执行期间更改了OS时区,则不会自动将其转发到JVM。但是你可以强制重新读取当前时区。
以下示例仅在Windows环境中进行了测试。
TestTimeZone
Control Panel\Clock, Language, and Region
- change the time zone
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