gpt4 book ai didi

java - SimpleDateFormat 对于同一输入返回两个不同的结果

转载 作者:太空宇宙 更新时间:2023-11-04 06:55:24 25 4
gpt4 key购买 nike

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

关于java - SimpleDateFormat 对于同一输入返回两个不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22804231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com