我收到一个日期字符串 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); 
} 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!