这是我的目标格式:
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);
有谁知道出了什么问题?谢谢。
仅供参考,例外消息:
无法解析的日期:“2011年8月19日”,位于java.text.DateFormat.parse(未知 源)
但我不认为它有用......
答案 0 :(得分:7)
解析出了问题。由于这个原因你没有发现它:
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。如果您之后使用该值进行任何重要工作,我肯定建议使用它超过Date
/ Calendar
。)
答案 1 :(得分:1)
默认情况下,SimpleDateFormat依赖于当前日历和区域设置上的日历。 根据区域设置和日历,“AUG”可能不是该月的有效文本。
AUG是US Locale的有效字符串,但不适用于ES Locale。
您可以强制将语言环境添加到美国,将其添加到SimpleDateFormat:
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy",Locale.US);
使用美国语言环境,如果日期为2个字母,则可以正确解析字符串。
答案 2 :(得分:0)
我刚试过你的代码,它运行正常。尝试运行以下内容:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Playground {
public static void main(String... args) {
String returnDate = "19 AUG 2011";
SimpleDateFormat formatter ;
Date date = null ;
formatter = new SimpleDateFormat("dd MMM yyyy");
try {
date = formatter.parse(returnDate);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(date.toString());
Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println(cal.getTime().toString());
}
}
输出:
8月19日00:00:00 CAT 2011
8月19日00:00:00 CAT 2011