将日期对象转换为日历对象 [重复]
Posted
技术标签:
【中文标题】将日期对象转换为日历对象 [重复]【英文标题】: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());
【问题讨论】:
对于迟到的人:我建议您既不要使用Date
,也不要使用Calendar
。这些课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time API 的Instant
和ZonedDateTime
。
【参考方案1】:
这是你的方法:
public static Calendar toCalendar(Date date)
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal;
你所做的一切都是错误和不必要的。
顺便说一句,Java 命名约定建议方法名称以小写字母开头,因此应该是:dateToCalendar
或 toCalendar
(如图所示)。
好的,让我们挤一下你的代码,好吗?
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
关联的日历对象当前保存着我们刚刚格式化的日期,并且作为没有小时/分钟/秒的日期格式化的副作用,该内部日期也没有小时/分钟/秒。也许,但没有记录的行为。做公认的答案,这直接说明了我们正在尝试做的事情。如果您想删除小时/分钟/秒,请参阅有关如何执行此操作的已接受答案的评论。以上是关于将日期对象转换为日历对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章