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

时间:2012-01-21 20:48:30

标签: java time timezone

我们正在服务器中记录一些事件,我们获取每个事件的当前时间,实例化一个新的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");

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

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

  

日期格式未同步。建议创建   每个线程的单独格式实例。如果有多个线程访问   同时格式化,必须在外部同步。

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

由于同时使用SimpleDateFormat,可能会因某些竞争条件或其他与线程相关的错误而导致错误。