将一个Date对象转换成一个日历对象

225

我从一个传入的对象中获取了一个日期属性,形式如下:

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()); 

1
对于来得晚的人:我建议你不要使用DateCalendar。这些类设计不佳且过时。相反,使用来自 java.time,现代Java日期和时间APIInstantZonedDateTime - Ole V.V.
3个回答

517

以下是您的方法:

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()); 
< p > DateFormat 用于将字符串转换为日期 (parse()) 或将日期转换为字符串 (format())。您正在使用它将日期的字符串表示形式解析回日期。这不对吧,对吗?


非常感谢。我实际上是从一个网站上得到了那段代码。鉴于上述方法的简洁性,我现在开始觉得我的intToCalendar方法可能有些臃肿。public static Calendar intToCalendar(int i) { Calendar cal = null; try { String stringInt = String.valueOf(i); DateFormat formatter = new SimpleDateFormat("yyyyMMdd"); Date date = (Date)formatter.parse(stringInt); cal=Calendar.getInstance(); cal.setTime(date); } catch (ParseException e) { System.out.println("Exception :"+e); } return cal; }` - Will
1
@Will a) 不要使用int,使用long。日期可以保存比int能存储的更大的值。 b) 使用new Date(long) - Sean Patrick Floyd
1
看起来原问题中的代码不仅意在将 Date 转换为 Calendar,而且还打算同时从日期中删除时间。如何正确地执行后者可以在这里找到。请尝试使用 formatter.parse(formatter.format(date)); 替代 (Date)formatter.parse(date.toString()); - Chris
我认为原来的代码试图仅解析格式化日期的年-月-日,以便将日历设置为一天的开始,而不是某个时间在中午。这是一个可爱的方法(尝试)去做到它,尽管 set(HOUR_OF_DAY, 0) 等方法更好。 - Andy

25

-7

这很简单...像这样将日期转换为日历:

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

5
两年前被接受的解决方案是更清晰的方法。请注意,这段代码有一个隐含的假设,即与 'format' 相关联的日历对象当前持有我们刚刚格式化的日期,并且作为使用没有小时/分钟/秒的日期进行格式化的副作用,该内部日期也没有小时/分钟/秒。也许是这样,但这不是文档化的行为。请按照被接受的答案所做的直接说明我们要做什么。如果您想删除小时/分钟/秒,请参见被接受的答案中关于如何执行此操作的评论。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接