字符串到Calendar对象

时间:2011-08-17 06:25:46

标签: 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);

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

仅供参考,例外消息:

  

无法解析的日期:“2011年8月19日”,位于java.text.DateFormat.parse(未知   源)

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

3 个答案:

答案 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