java - 字符串到日历对象

标签 java debugging calendar

这是我的目标格式:

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/

相关文章:

javascript - 填充 Web 表单的最佳日历弹出窗口是什么?

Android - 如何将通知设置为将来的特定日期?

java - JAVA 中 XML 的有序列表级别

java - 如何注释java包并反射(reflect)元数据

java - 如何解决错误 "java.lang.IllegalArgumentException: Can' t 初始化已配置的调试器!”在 smack 中

perl - 如何让 Perl 的调试器和 gVim 在 Linux 上协同工作?

java - 如何使用配置文件禁用 Maven 安装和部署阶段?

java - ThreadPoolTask​​Scheduler 不适用于线程池

c - 尝试生成 base64 编码值时出现段错误 - C

javascript - 在日期选择器上隐藏日历