这是我的目标格式:
19 AUG 2011
我尝试通过以下代码将此字符串转换为 Calendar 对象,但变量“date”仍然为空..
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);
有谁知道出了什么问题吗?谢谢。
仅供引用,异常消息:
Unparseable date: "19 Aug 2011" at java.text.DateFormat.parse(Unknown Source)
但我认为这没什么用...
最佳答案
解析出现问题。您之所以没有发现它,是因为:
catch (ParseException e) {
}
这基本上是在说,“我不在乎出了什么问题 - 忽略它。”至少,您应该记录错误,并且更有可能让异常冒泡。
异常是一种非常重要的诊断工具 - 不要只是捕获它们并忽略它们。
编辑:现在问题已经改变,我们可以看到异常 - 但代码仍在继续,就好像什么也没发生一样。即使您确实想基本上忽略异常,您也需要决定在解析失败时想要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;
}
}
请注意,我们不需要单独声明变量来为其赋值,而且现在我们让异常冒泡,我们可以直接为 date
分配其有用值。
我猜测是您的默认时区不使用“AUG”作为短月份名称 - 但如果没有看到异常,我无法真正判断。如果是这种情况,您可能需要在构造格式化程序时指定区域设置:
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy",
Locale.US);
您可能还想指定时区。
(顺便说一句,Joda Time 是一个非常优秀的用于日期和时间处理的 API。如果您之后要对该值进行任何重要的工作,我绝对建议使用它日期
/日历
。)
关于java - 字符串到日历对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7088718/