2016-01-27 110 views
2

我尝试解析字符串的日期:Java:How to Parse String to Date correct?

String dateString = "Fr, 1. Jan"; 
DateFormat format = new SimpleDateFormat("EE, d. MMM"); 
Date date = null; 
try { 
    date = format.parse(dateString); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
System.out.println(format.format(date)); 

而我得到的输出是这些:

Do, 1. Jan 

为什么会这样,为什么不是它作为输出相同输入?

+0

我想天名至少需要3个字母。 – m0skit0

+0

也许它与你的时区有关,但是也应该改变1. Jan应该改变(尤其是因为1月1日不是Donnerstag)......试着打印出完整的日期并告诉我们,你得到了什么。 – ctst

+0

仅供参考:如果使用'Locale.GERMAN'作为第二个参数初始化'SimpleDateFormat',则可以重现。 –

回答

3

你忘记了一年。当你解析它时,你会在1970年(星期五将被忽略)。当你解析时,你会解析日期1970年1月1日,这是一个星期四。这应该工作:

String dateString = "Fr, 1. Jan"; 
    DateFormat format = new SimpleDateFormat("EE, d. MMM"); 
    Date date = null; 
    try { 
     date = format.parse(dateString); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    date.setYear(new Date().getYear()); //alternativ: date.setYear(2016); 

    System.out.println(date); 
    System.out.println(format.format(date)); 
2

“Do”是“Donnerstag”的前两个字母,它是德文的“Thursday”。以你的姓氏“Baum”(德语为“树”)来判断,我猜这不是巧合。另外,1970-01-01是一个星期四,如果你没有指定年份,你会得到开始的时代。

日期格式“E”是一个单词的星期几 - 您指定的“E”越多,该单词的字母越多; “EE”会在德语语言环境中将“星期四”呈现为“Do”,可疑是您的默认语言环境。

你的代码,对我来说是爆炸,但这种类似的代码生成,你得到的结果相同:

String dateString = "Fri, 1. Jan"; 
DateFormat format = new SimpleDateFormat("EEE, d. MMM"); 
Date date = format.parse(dateString); 
DateFormat format2 = new SimpleDateFormat("EE, d. MMM", Locale.GERMAN); 
System.out.println(format2.format(date)); 

输出:

Do, 1. Jan 
2

Java中的Date始于01-01-1970。 1970年1月1日是星期四,因此它把这一天解释为星期四而不是星期五。你将不得不增加一年才能保证它是星期五。