2016-03-01 102 views
0

我们托管在CST定时工作安装机器上的应用程序服务器上我们的应用程序之一。现在,在应用程序页脚我们显示使用java.util.date().toString();java.util.date()总是显示GMT时间

现在从这个post我可以说java.util.Date的参考上次登录的时间和日期()。toString()方法是使用TimeZone.getDefault()方法,进而将默认设置为正在运行的操作系统的时区(即主机)。

所以,应用应根据CST timzone显示计时,但它不是为这个服务器只发生,它总是显示GMT timzone。

这里是表示时间的配置和从“时间”指令的服务的结果,以及应用程序管理UI,表示GMT时间其是在页脚可见一个附屏幕截图。

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

enter image description here

+0

你能告诉我们你的格式化的日期代码? – keuleJ

+0

@keuleJ等待让我看看如果我可以? –

回答

1

更好地使用乔达时间,日期时间对象(DATETIME)确实只知道其指定的时区。这意味着与UTC的偏移以及该时区的夏令时(DST)和其他此类异常的规则和历史记录。

的Java SE 8之前的标准的日期和时间的类差。通过解决这个问题硬碰硬,乔达时间成为面向Java的Java之前SE 8

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

+1

该项目处于维护模式!我不能做出更大的改变,因为他们可能会干扰其他功能,只是我想知道什么可能是显示异常行为的可能原因! –

+0

date.toString方法的逻辑是TimeZone zi = date.getZone(); if(zi!= null){sb.append(zi.getDisplayName(date.isDaylightTime(),zi.SHORT,Locale.US)); // zzz} else {sb.append(“GMT”); }所以如果zi是空的,它会附加GMT。因此,在指定的机器中检查date.getZone返回的内容。 – Aajan

+1

顺便说一句,像乔达时间等其他图书馆会遭受同样的问题,以确定系统时区,看到我的答案。这甚至包括Java-8。推荐一个项目所有者自己正式推荐远离Java项目的项目也值得怀疑。 –

1

A java.util.Date object表示一个时间戳。时间戳是特定时刻,并没有时区的概念。在显示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)) 
+0

但根据我从stackoverflow共享的链接,它应该始终根据系统时区默认情况下所以我的问题是为什么它显示异常行为!!!!! –

+1

事实并非如此。在早期的Java版本中,java.util.Date类负责处理DateFormat和Calendar今天完成的许多事情。当这个改变时,Date的定义变成了一个简单的时间戳对象。但是,处理时区的代码仍然存在,但不推荐使用。这意味着您实际上可以设置Date对象的时区,在这种情况下,该时区将在'toString()'方法中使用。 –

2

正如你已经认识到,中java.util.Date.toString()行为是基于TimeZone.getDefault()

  • 使用user.timezone属性值设置为默认时区ID,如果它是可用的。
  • 检测平台时区ID。平台时区和ID映射的来源可能因实现而有所不同。
  • 使用GMT作为最后的手段,如果给定或检测时区ID是未知的。

的JVM可能无法interprete底层操作系统的时区,例如,如果操作系统使用,不能被解析为一个IANA TZDB共同标识的Windows时区名称。

解决方案:

我建议你先从下面的系统属性的JVM:

-Duser.timezone=America/Chicago