【问题标题】:Strange behavior getting time using new Date() in java在 java 中使用 new Date() 获取时间的奇怪行为
【发布时间】:2012-01-21 20:48:30
【问题描述】:

我们在我们的服务器中记录一些事件,我们获取每个事件的当前时间,实例化一个新的 Date 对象。像这样new Date()

但是昨天出了点问题。记录器显示此条目记录在2012-01-21 14:06:04,但该事件与new Date() 的时间不同,这个:2012-01-21 13:06:04

相差一小时。

尽管如此,其他事件在此错误事件之前和之后都会获得正确的时间。

奖金

我们使用此格式化程序记录事件:

// Of course, this means that we read our buggy timestamp like: '120121130604'
// but that's irrelevant :p
public static SimpleDateFormat messageDateTimeFormatter = new SimpleDateFormat("yyMMddHHmmss");

有什么想法吗?

【问题讨论】:

  • 您在哪个时区运行/JVM 的默认时区是什么?
  • 这是操作系统时区:UTC-4:00 GeorgeTown, La Paz, Manaus, San Juan
  • JVM 说:user.timezone = America/La_Paz

标签: java time timezone


【解决方案1】:

鉴于您的 SimpleDateFormat 是一个公共静态字段,我猜想多个线程同时使用它。但是SimpleDateFormat is not thread-safe

日期格式不同步。建议创建 每个线程的单独格式实例。如果多个线程访问 并发格式,必须对外同步。

同步其使用,或将其存储在 ThreadLocal 变量中,或每次创建一个新实例。

由于并发使用 SimpleDateFormat,您得到的结果可能是由某些竞争条件或其他与线程相关的错误引起的。

【讨论】:

  • +1 这是一个经典的“陷阱”。我也很早就被这个绊倒了。这里真正的恶棍是将 SimpleDateFormat 编码为非线程安全的白痴 - 它是线程之间缓存/重用的明显候选者
  • 虽然我完全同意这是一个应该解决的问题,但我怀疑它是否会导致 OP 的问题 - 特别是考虑到所指出的时间正好相隔 1 小时。听起来更像是一个时间变化问题。
  • 我也不确定这是否是问题的原因。这就是为什么我说“可能是造成的”。但由于记录器在同一时刻正确显示同一时间,这仍然是我最好的选择。
  • 我认为这是原因。谢谢JB!! +1 一些解决方案:codefutures.com/weblog/andygrove/2007/10/…
猜你喜欢
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
相关资源
最近更新 更多