字符串到Calendar对象

Bea*_*ear 0 java debugging calendar

这是我的目标格式:

2011年8月19日

我尝试通过以下代码将此字符串转换为Calendar对象,但变量"date"保持为null.

SimpleDateFormat formatter ; 
        Date date = null ; 
        formatter = new SimpleDateFormat("dd MMM yyyy");
        try {
         date = formatter.parse(returnDate);
    } catch (ParseException e) {            
        e.printStackTrace();
    } 
        Calendar cal=Calendar.getInstance();
        cal.setTime(date);
Run Code Online (Sandbox Code Playgroud)

有谁知道出了什么问题?谢谢.

仅供参考,例外消息:

无法解析的日期:"java 2011年8月19日"java.text.DateFormat.parse(未知来源)

但我不认为它有用......

Jon*_*eet 7

解析出了问题.由于这个原因你没有发现它:

 catch (ParseException e) {            

 } 
Run Code Online (Sandbox Code Playgroud)

这基本上是在说,"我不在乎出了什么问题 - 忽略它." 在最起码你应该记录错误,更可能让异常泡沫了.

例外是一个非常重要的诊断工具 - 不要只是抓住它们而忽略它们.

编辑:现在问题已经改变,我们可以看到异常 - 但代码仍在继续,好像什么也没发生.即使您确实希望忽略异常,也需要确定解析失败时希望 date获得的值.显然null是无益的-所以你需要要么让异常冒泡(让对方有解析失败)返回一些差异值(例如默认的日期或今天,或者类似的东西).

现在,正如它发生的那样,让异常泡沫化也会使代码变得更简单.它不会在我的机器上引发异常,但也许它会在你的机器上:

import java.util.*;
import java.text.*;

public class Test {

    public static void main(String[] args) throws Exception {
      Calendar cal = parseReturnDate("19 AUG 2011");
      System.out.println(cal);
    }

    public static Calendar parseReturnDate(String returnDate) 
        throws ParseException {
      SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy");
      Date date = formatter.parse(returnDate);
      Calendar cal=Calendar.getInstance();
      cal.setTime(date);
      return cal;
    }       
}
Run Code Online (Sandbox Code Playgroud)

注意我们不需要单独声明变量来分配它们的值,现在我们让异常冒泡,我们可以直接分配date它的有用值.

我的猜测是你的默认时区不使用"AUG"作为短月份名称 - 但是如果没有看到异常我就无法告诉你.如果是这种情况,您可能希望在构造格式化程序时指定语言环境:

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy",
                                                  Locale.US);
Run Code Online (Sandbox Code Playgroud)

可能还想指定时区.

(顺便说一下,Joda Time是一个非常优秀的日期和时间处理API.如果你之后正在做任何重要的工作,我绝对建议在Date/上使用它Calendar.)