SimpleDateFormat为同一输入返回两个不同的结果

时间:2014-04-02 07:22:06

标签: java date-format simpledateformat

我收到了02.04.201406:26:06的日期字符串,我转换为另一个日期

public static final SimpleDateFormat SDF_DATE_TIME_RECEIVED = new SimpleDateFormat("dd-MM-yy HH:mm:ss");
static{
    SDF_DATE_TIME_RECEIVED.setTimeZone(TimeZone.getTimeZone("IST"));
}
SimpleDateFormat originalDateFormat = new SimpleDateFormat("dd.MM.yyyyHH:mm:ss");
originalDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = originalDateFormat.parse(dateString);
String newDateString = SDF_DATE_TIME_RECEIVED.format(date));

这是正确执行并给我的日期为02-04-14 11:56:06

现在我使用这个newDateString再次生成两种不同的格式,如下所示:

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
Date date = SDF_DATE_TIME_RECEIVED.parse(newDateString);
String datePart = dateFormat.format(date);
String timePart = timeFormat.format(date);

现在问题出现在上面提到的dateString的生产服务器上,我输出为:

newDateString = "04/02/2014 11:56:06"
datePart = "04/02/70"
timePart = "00:56:06"

我尝试在开发环境中重新创建场景,但我得到了正确的结果:

newDateString = "04/02/2014 11:56:06"
datePart = "04/02/14"
timePart = "11:56:06"

即使通过重新发送请求在生产环境上执行相同的过程,也会显示正确的输出。

这里可能出现什么问题?这不是一个孤立的问题。对于很多日期不正确的请求,这种情况几乎是随机发生的。

1 个答案:

答案 0 :(得分:1)

内部SimpleDateFormat是有状态的,因此将其设为静态final对于多线程问题根本没有帮助。如果您的代码被多个请求调用,则SDF_DATE_TIME_RECEIVED将提供损坏的结果。这是这个问题的第一个嫌疑人(特别是因为错误似乎是随机的),尝试将其更改为局部变量。

另一个想法是:你没有在dateFormat和timeFormat上设置任何时区。看起来你希望它是印度标准时间(IST)所以你应该这样做:

public static void main(String[] args) throws Exception {

    SimpleDateFormat SDF_DATE_TIME_RECEIVED = new SimpleDateFormat("dd-MM-yy HH:mm:ss");
    SDF_DATE_TIME_RECEIVED.setTimeZone(TimeZone.getTimeZone("IST"));

    SimpleDateFormat originalDateFormat = new SimpleDateFormat("dd.MM.yyyyHH:mm:ss");
    originalDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

    String dateString = "02.04.201406:26:06";
    Date date1 = originalDateFormat.parse(dateString);
    String newDateString = SDF_DATE_TIME_RECEIVED.format(date1);

    System.out.println(newDateString);

    SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
    dateFormat.setTimeZone(TimeZone.getTimeZone("IST"));
    SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
    timeFormat.setTimeZone(TimeZone.getTimeZone("IST"));

    Date date2 = SDF_DATE_TIME_RECEIVED.parse(newDateString);
    String datePart = dateFormat.format(date2);
    String timePart = timeFormat.format(date2);

    System.out.println("datePart=" + datePart);
    System.out.println("timePart=" + timePart);
}