【问题标题】:Converting a Date object to a calendar object [duplicate]将日期对象转换为日历对象 [重复]
【发布时间】:2011-09-05 08:53:54
【问题描述】:

所以我从表单中的传入对象中获取日期属性:

Tue May 24 05:05:16 EDT 2011

我正在编写一个简单的辅助方法来将其转换为日历方法,我使用的是以下代码:

    public static Calendar DateToCalendar(Date date ) 
{ 
 Calendar cal = null;
 try {   
  DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
  date = (Date)formatter.parse(date.toString()); 
  cal=Calendar.getInstance();
  cal.setTime(date);
  }
  catch (ParseException e)
  {
      System.out.println("Exception :"+e);  
  }  
  return cal;
 }

为了模拟传入的对象,我只是在当前使用的代码中分配值:

private Date m_lastActivityDate = new Date();

但是,一旦方法到达,这会给我一个空指针:

date = (Date)formatter.parse(date.toString()); 

【问题讨论】:

标签: java date calendar nullpointerexception


【解决方案1】:

这是你的方法:

public static Calendar toCalendar(Date date){ 
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  return cal;
}

你所做的一切都是错误和不必要的。

顺便说一句,Java 命名约定建议方法名称以小写字母开头,因此应该是:dateToCalendartoCalendar(如图所示)。


好的,让我们挤一下你的代码,好吗?

DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
date = (Date)formatter.parse(date.toString()); 

DateFormat 用于将字符串转换为日期 (parse()) 或将日期转换为字符串 (format())。您正在使用它将日期的字符串表示解析回日期。这不可能吧?

【讨论】:

  • 非常感谢伙计。我实际上得到了一个网站的代码。鉴于上述方法的简洁性,我现在开始觉得我的 intToCalendar 方法有点臃肿` public static Calendar intToCalendar(int i) {` Calendar cal = null;尝试 { String stringInt = String.valueOf(i); DateFormat 格式化程序 = new SimpleDateFormat("yyyyMMdd");日期日期 = (Date)formatter.parse(stringInt); cal=日历.getInstance(); cal.setTime(日期); } catch (ParseException e) { System.out.println("Exception :"+e); } 返回卡尔; }`
  • @Will a) 不要使用 int,使用 long。日期的值大于 int 可以存储的值。 b) 使用new Date(long)
  • 看起来原始问题中的代码不仅旨在将Date转换为Calendar,而且还同时从日期中删除时间。后者如何正确做可以找到here。不要使用(Date)formatter.parse(date.toString());,而是尝试formatter.parse(formatter.format(date));
  • 我认为原始代码试图仅解析格式化日期的年月日,以便将日历设置为一天的开始,而不是中间的某个时间日。虽然set(HOUR_OF_DAY, 0) 等更好。
【解决方案2】:

只需使用 Apache Commons

DateUtils.toCalendar(Date date)

【讨论】:

    【解决方案3】:

    这很容易...像这样将日期转换为日历:

    Calendar cal=Calendar.getInstance();
    DateFormat format=new SimpleDateFormat("yyyy/mm/dd");
    format.format(date);
    cal=format.getCalendar();
    

    【讨论】:

    • 两年前接受的解决方案是一种更清洁的方法。请注意,此代码有一个隐藏的假设,即与 format 关联的日历对象当前保存着我们刚刚格式化的日期,并且作为没有小时/分钟/秒的日期格式化的副作用,该内部日期也没有小时/分钟/秒。也许,但没有记录的行为。做公认的答案,这直接说明了我们正在尝试做的事情。如果您想删除小时/分钟/秒,请参阅有关如何执行此操作的已接受答案的评论。
    猜你喜欢
    • 2014-05-31
    • 2019-12-29
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多