【问题标题】:java.util.date() always showing GMT timingjava.util.date() 总是显示 GMT 时间
【发布时间】:2016-03-01 07:17:40
【问题描述】:

我们有一个应用程序托管在应用程序服务器上,该应用程序服务器安装在以 CST 计时工作的机器上。现在在应用程序页脚中,我们使用 java.util.date().toString(); 显示上次登录时间和日期

现在从 post 的引用中我可以说 java.util.Date().toString() 正在使用 TimeZone.getDefault() 方法,该方法又将默认为操作系统的时区在(即主机)上运行。

所以应用程序应该根据 CST 时区显示时间,但它不仅仅发生在这个服务器上,它总是显示 GMT 时区。

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

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

【问题讨论】:

  • 你能告诉我们你格式化日期的代码吗?
  • @keuleJ 等我看看我能不能???

标签: java date timezone java.util.date


【解决方案1】:

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

  • 使用 user.timezone 属性值作为默认时区 ID(如果可用)。
  • 检测平台时区 ID。平台时区和 ID 映射的来源可能因实施而异。
  • 如果给定或检测到的时区 ID 未知,则使用 GMT 作为最后的手段。

JVM 可能无法解释底层操作系统的时区,例如,如果操作系统使用的 Windows 时区名称无法解析为 iana-tzdb 中常见的标识符。

解决方案:

我建议您使用以下系统属性启动 JVM:

-Duser.timezone=America/Chicago

【讨论】:

    【解决方案2】:

    最好使用 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

    【讨论】:

    • 项目处于维护模式!!!我无法进行更大的更改,因为它们会干扰其他功能,只是我想知道显示异常行为的可能原因是什么!
    • 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 返回的内容。
    • 顺便说一句,Joda-Time 等其他库在确定系统时区时会遇到同样的问题,请参阅我的回答。这甚至包括 Java-8。推荐一个项目所有者本人正式建议离开它的项目(到 Java-8)也是有问题的。
    • 我已经看到你的回答了。我没有意识到这一点。谢谢。
    【解决方案3】:

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

    【讨论】:

    • 但是根据我从stackoverflow共享的链接,它应该始终根据系统时区默认所以我的问题是为什么它显示异常行为!!!!!!
    • 实际情况并非如此。在 Java 的早期版本中,java.util.Date 类负责处理当今由 DateFormat 和 Calendar 完成的许多事情。当这个改变时, Date 的定义变成了一个简单的时间戳对象。但是,处理时区的代码仍然存在,但已被弃用。这意味着您实际上可以设置 Date 对象的时区,在这种情况下,该时区将在 toString() 方法中使用。
    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多