2012-03-22 189 views
10

当我试图将字符串解析为日历时,出现了最奇怪的错误。 它似乎弄乱了我用来设置结果日历时间的Date对象。这个错误很不一致(或者我没有看到它的逻辑)。任何人都可以指出我可能做错了什么?使用SimpleDateFormat.parse()时获取错误数据

public class caltest{ 
public static final SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS"); 

public static void main(String[] args) { 
    String date1 = "1992-03-11 12:00:12.123"; 
    String date2 = "1993-03-11 12:00:12.123"; 
    String date3 = "1994-03-11 12:00:12.123"; 
    String date4 = "1995-03-11 12:00:12.123"; 
    parseStringAsCalendar(date1); 
    parseStringAsCalendar(date2); 
    parseStringAsCalendar(date3); 
    parseStringAsCalendar(date4); 
} 
public static String calendarToString(Calendar cal) { 
    return sdf.format(cal.getTime()); 
} 

public static Calendar parseStringAsCalendar(String s) { 
    Date time = null; 
    try { 
     time = sdf.parse(s); 
    } catch (ParseException e) { 
     System.out.println("Exception"); 
     e.printStackTrace(); 
    } 
    System.out.println(time.toString()); 
    GregorianCalendar ret = new GregorianCalendar(); 
    ret.setTime(time); 

    return ret; 
} 

}

输出是:

Sun Dec 29 12:00:12 CET 1991 
Sun Dec 27 12:00:12 CET 1992 
Sun Dec 26 12:00:12 CET 1993 
Sun Jan 01 12:00:12 CET 1995 

回答

18

你在你的格式说明,这是周年(如Java 7的,我相信)使用YYYY。你想yyyy,这只是“年”。 (请参阅SimpleDateFormat documentation。)

我怀疑日期的其余部分已经过期,因为您试图指定月份和日期,这些在一周中不是真正的“功能”......如果您已指定在和星期几“每周的星期”,它有可能给一些有意义的结果,但前提是你真的意味着使用一周里,我怀疑:)

+0

这两个答案都非常有用,这一个照在潜在的问题更多的是光的。我正在检查错误的文档。 – Tegi 2012-03-22 23:44:22

+3

你刚刚在互联网上从几个小时的无果搜索中拯救了我!谢谢 – KoW 2013-11-13 13:47:02

+0

* year *和* week year *之间的区别究竟是什么?该文档对于这个区别有点稀疏(就像Calendar的文档一样)。 – tytk 2015-07-23 19:04:07

3

使用此:

public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

年份为小写y,而非大写Y。就这样,结果是:

Wed Mar 11 12:00:12 EST 1992 
Thu Mar 11 12:00:12 EST 1993 
Fri Mar 11 12:00:12 EST 1994 
Sat Mar 11 12:00:12 EST 1995 

在这里看到: