Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleDataFormat为同一输入返回两个不同的结果_Java_Date Format_Simpledateformat - Fatal编程技术网

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

Java SimpleDataFormat为同一输入返回两个不同的结果,java,date-format,simpledateformat,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 original

我收到一个日期字符串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"
我尝试在dev环境中重新创建场景,但得到了正确的结果:

newDateString = "04/02/2014 11:56:06"
datePart = "04/02/14"
timePart = "11:56:06"
即使通过重新发送请求在生产环境中执行相同的过程,也会显示正确的输出


这里会出什么问题?这不是一个孤立的问题。许多日期不正确的请求都会出现这种情况,几乎是随机的。

内部SimpleDataFormat是有状态的,因此将其设为静态final对多线程问题毫无帮助。如果您的代码被多个请求调用,收到的SDF_DATE_TIME_将给出损坏的结果。它是这个问题的第一个疑点(特别是因为错误似乎是随机的),请尝试将其更改为局部变量

另一个想法是:您没有在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);
}

开发和生产的默认时区是什么?此外,SimpleDataFormat不是线程安全的,因此如果可以在多线程环境中使用,则不应创建静态实例。请尝试隔离它是解析还是格式化。您正在执行两个解析操作和三个格式操作-如果您可以将其修复为新日期(一些常量值);字符串文本=格式。格式(日期)并仍然显示差异,这将使帮助您更容易。还要注意,您没有在
dateFormat
timeFormat
中设置时区,因此您将获得系统默认时区。(你甚至可能会得到系统默认的日历-我不确定。)最后,
SimpleFormat
不是线程安全的…第一个结果“04-02-14 11:56:06”是错误的,应该是“02-04-14 11:56:06”(两种格式都有日-月-年顺序)@AdriaanKoster抱歉输入错误。。更正了。。。。是的,我使用的是多线程环境,但只有SDF_DATE_TIME_RECEIVED是静态的。所有其他日期格式都是局部变量。此外,我不会更改初始化后收到的SDF_日期_时间_。多线程如何影响这一点?此外,它是静态的和最终的。生产服务器上的系统时间和时区是什么?顺便说一句,IST表示印度标准时间:)