我收到了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"
即使通过重新发送请求在生产环境上执行相同的过程,也会显示正确的输出。
这里可能出现什么问题?这不是一个孤立的问题。对于很多日期不正确的请求,这种情况几乎是随机发生的。
答案 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);
}