java.util.date()始终显示GMT时序

时间:2016-03-01 07:17:40

标签: java date timezone java.util.date

我们的一个应用程序托管在安装在CST计时工作的计算机上的应用程序服务器上。现在,在应用程序页脚中,我们使用java.util.date().toString();

显示上次登录时间和日期

现在引用这个post我可以说java.util.Date()。toString()正在使用TimeZone.getDefault()方法,而后者将默认为操作系统的时区它正在运行(即主机)。

因此,应用程序应该根据CST timzone显示时间,但它不会仅发生在此服务器上,它始终显示GMT时区。

这是一个附加屏幕截图,显示时间配置和服务上“时间”命令的结果,以及应用程序管理界面,显示在页脚中可见的GMT时间。

所以我正在寻找可能的原因,为什么java.util.date.toString()显示出这种意外的行为以及解决方案是什么?

enter image description here

3 个答案:

答案 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);

参考文献: 乔达时间: http://googleweblight.com/?lite_url=http://www.joda.org/joda-time/&ei=fiQH2-Y-&lc=en-IN&s=1&m=717&host=www.google.co.in&ts=1456818933&sig=ALL1Aj74vOgr-H7yxBKCAWq5KKQ28MTvvw

时区: http://joda-time.sourceforge.net/timezones.html

答案 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))