timedatectl和Java的TimeZone的功能
好久没发布了。因为太惊讶和生气了。
我正在进行将基于Java构建的系统从Amazon Linux迁移到Amazon Linux 2的工作时发现了这个问题。
在Amazon Linux 2中,要设置系统的时区,请执行以下命令。
#timedatectl set-timezone "Asia/Tokyo"
通常情况下,这应该是完全正常的,即使在搜索互联网上也只能找到关于Amazon Linux 2和CentOS 7系列的文章,并没有其他的内容提及。
然而,在Java程序内,无法正确获取TimeZone,而只能使用UTC。
样本:
import java.util.Calendar;
class TimeZoneInfo {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTimeZone());
System.out.println(System.getProperty("user.timezone"));
}
}
执行结果:
sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
UTC
有几种方法可以进行应对。(找到方法花了很长时间)
-
- 在中文中,只需要一个选项来重新表述以下内容:
设置环境变量TZ=Asia/Tokyo
在Java命令行中添加-Duser.timezone=Asia/Tokyo
执行修正Amazon Linux早期版本中的/etc/sysconfig/clock的设置方法。
我认为存在一些问题。
-
- timedatectlでは/etc/localtimeは書き換えてくれるが、/etc/sysconfig/clockは書き換えてくれない。(そもそもCentOS7だとファイル自体がないらしい・・・・)
-
- Javaは/etc/localtimeを見てくれない。バージョンによって違うらしい。glibcの挙動の変化かもしれないが、詳細な原因は分からない。
-
- systemd系になって/etc/sysconfigはあまり参照されなくなったが、過去の遺産は残っているので、互換性にもう少し考慮してくれ。。。。
- 旧システムはJava1.6で実行、新システムはJava7で実行。Java8以降の最新だとどうなってるのかは知らん。
请告诉我哪种是最正确(应该)的处理方式呢?或者至少统一一下时区设置。