我们的一个应用程序托管在安装在CST计时工作的计算机上的应用程序服务器上。现在,在应用程序页脚中,我们使用java.util.date().toString();
现在引用这个post我可以说java.util.Date()。toString()正在使用TimeZone.getDefault()方法,而后者将默认为操作系统的时区它正在运行(即主机)。
因此,应用程序应该根据CST timzone显示时间,但它不会仅发生在此服务器上,它始终显示GMT时区。
这是一个附加屏幕截图,显示时间配置和服务上“时间”命令的结果,以及应用程序管理界面,显示在页脚中可见的GMT时间。
所以我正在寻找可能的原因,为什么java.util.date.toString()
显示出这种意外的行为以及解决方案是什么?
答案 0 :(得分:2)
正如您已经认识到的那样,java.util.Date.toString()
的行为基于TimeZone.getDefault()。
- 使用user.timezone属性值作为默认时区ID(如果可用)。
- 检测平台时区ID。平台时区和ID映射的来源可能因实施而异。
- 如果给定或检测到的时区ID未知,请使用GMT作为最后的手段。
JVM可能无法解释底层操作系统的时区,例如,如果操作系统使用的Windows时区名称无法解析为iana-tzdb中常用的标识符。
<强>解决方案:强>
我建议您使用以下系统属性启动JVM:
-Duser.timezone=America/Chicago
答案 1 :(得分:1)
更好地使用Joda-Time,日期时间对象(DateTime)确实知道其指定的时区。这意味着与UTC的偏移以及该时区的夏令时(DST)和其他此类异常的规则和历史记录。
Java SE 8之前的标准日期和时间类别很差。通过正面解决这个问题,Joda-Time成为Java SE 8之前Java事实上的标准日期和时间库。
DateTimeZone dateTimeZone = DateTimeZone.forID("America/Chicago");
DateTime dateTime = DateTime.now(dateTimeZone);
System.out.println("Current time is: " + dateTime);
答案 2 :(得分:1)
java.util.Date
对象表示时间戳。时间戳是特定时刻,没有时区概念。显示java.util.Date
时,您需要格式化相对于给定时区的时间。
通常的方法是使用java.text.DateFormat
:
Date d = new Date()
DateFormat dateForamt = DateFormat.getDateTimeInstance()
// The default timezone is the timezone that is default for the user, but it
// can be changed like so:
dateFormat.setTimeZone(someTimezone)
System.out.println(dateFormat.format(d))