在java中使用new Date()获取时间的奇怪行为

在java中使用new Date()获取时间的奇怪行为,java,time,timezone,Java,Time,Timezone,我们在服务器上记录一些事件,我们得到每个事件的当前时间,并实例化一个新的日期对象。像这样newdate() 但昨天出了点问题。记录器显示此条目记录在2012-01-21 14:06:04,但事件的时间与新日期()不同,此日期:2012-01-21 13:06:04 相差一小时。 尽管如此,其他事件在这个错误事件前后都有一个正确的时间 奖金 我们使用此格式化程序记录事件: // Of course, this means that we read our buggy timestamp like:

我们在服务器上记录一些事件,我们得到每个事件的当前时间,并实例化一个新的日期对象。像这样
newdate()

但昨天出了点问题。记录器显示此条目记录在
2012-01-21 14:06:04
,但事件的时间与
新日期()不同,此日期:
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");

有什么想法吗?

鉴于SimpleDataFormat是一个公共静态字段,我猜多个线程正在同时使用它。但是:

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

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


您得到的可能是由于并发使用SimpleDateFormat导致的某些争用条件或其他与线程相关的错误。

鉴于SimpleDateFormat是一个公共静态字段,我猜多个线程正在并发使用它。但是:

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

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


您得到的可能是由于并发使用SimpleDataFormat导致的某些竞争条件或其他与线程相关的错误。

您运行的是哪个时区/JVM的默认时区是什么?这是操作系统时区:UTC-4:00乔治敦、拉巴斯、马瑙斯、,San Juan和JVM说:user.timezone=America/La_Paz你在哪个时区运行/JVM的默认时区是什么?这是操作系统时区:UTC-4:00乔治敦、拉巴斯、马瑙斯、San Juan和JVM说:user.timezone=America/La_Paz+1这是一个经典的“陷阱”。我也很早就被这个绊倒了。这里真正的恶棍是将SimpleDataFormat编码为非线程安全的白痴——它显然是线程间缓存/重用的候选者。虽然我完全同意这是一个应该解决的问题,但我怀疑它是否导致了OP的问题——特别是考虑到注意到的时间间隔正好为1小时。听起来更像是时间变化的问题。我也不确定这是否是问题的原因。这就是为什么我说“可能是造成的”。但由于记录器在同一时间、同一瞬间正确显示,这仍然是我的最佳选择。我认为这就是原因。谢谢你,JB+1一些解决方案:+1这是一个经典的“陷阱”。我也很早就被这个绊倒了。这里真正的恶棍是将SimpleDataFormat编码为非线程安全的白痴——它显然是线程间缓存/重用的候选者。虽然我完全同意这是一个应该解决的问题,但我怀疑它是否导致了OP的问题——特别是考虑到注意到的时间间隔正好为1小时。听起来更像是时间变化的问题。我也不确定这是否是问题的原因。这就是为什么我说“可能是造成的”。但由于记录器在同一时间、同一瞬间正确显示,这仍然是我的最佳选择。我认为这就是原因。谢谢你,JB+1.一些解决方案: