我收到一个日期字符串 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"
即使通过重新发送请求在生产环境中执行相同的过程,也会出现正确的输出。
这里可能出了什么问题?这不是一个孤立的问题。许多日期不正确的请求几乎是随机发生的。
请您参考如下方法:
SimpleDateFormat 内部是有状态的,因此将其设为静态最终对解决多线程问题完全没有帮助。如果您的代码被多个请求调用,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);
}