有没有机器的时区没有设置?

我假定所有的系统(Windows,Mac,Linux,Solaris,SunOS,HP-UX,AIX,FreeBSD,NetWare,OS / 400等)都有一个时区值。 因此,我写了下面的程序来获取系统的本地时区:

import java.text.DateFormat; public class LocalTimeZone { public static void main(String[] args) { String local_time_zone; DateFormat df = DateFormat.getTimeInstance(DateFormat.FULL); local_time_zone=df.getTimeZone().getID(); System.out.println("local time zone: " + local_time_zone); } } 

输出: local time zone: Asia/Calcutta

时区值设置在我的机器,因此输出显示我的本地时区。

能不能有一台没有设置时区的机器?

这确实是可能的,而且在嵌入式Linux系统上很常见。 例如,当整个操作系统必须以64MB的速度从闪存中运行时,供应商可能会在为其设备编译Linux堆栈时选择不包含时区。

即使没有设置,我会认为Java会返回一个默认值(可能是UTC),因为它运行在一个更高的水平。

AFAIK,在Windows上总会有一个时区。 (我不确定WindowsCE)

从技术上来说,是的。 实际上,没有。 我认为最重要的问题是你应该支持什么。 如果你不需要支持边缘系统,那么不要担心。

简答:可以,但不应该

就个人而言,我更喜欢在我的服务器上处理UTC,因为当我在世界各地移动一台机器(在我的工作中,发生了很多事情)时区和DST的概念将会搞砸。 即使我有一个时区设置:雷克雅未克。 这是让机器在没有DST的情况下运行UTC的最简单的方法。

即使假设您可以找到未设置时区的操作系统,您也无法从Java代码中确定这一点。

时区是从格式化程序中存储的Calendar对象中检索的。 如果在Calendar.getInstance()的调用中没有指定任何内容,则Calendar始终与时区相关联,使用TimeZone.getDefault()返回的值。

TimeZone.getDefault()总是返回一个时区的值,使用GMT如果它真的不知道本地使用什么。 从Javadocs :

  • 如果给定或检测到的时区ID未知,则使用GMT作为最后的手段