设置java日期的年份

时间:2012-08-15 09:20:17

标签: java date calendar

我正在尝试设置java.util.Date的年份。

我需要解析的时间戳不包括年份所以我这样做了:

private static final SimpleDateFormat logTimeStampFormat = 
    new SimpleDateFormat("MMM dd HH:mm:ss.SSS");

boolean isAfterRefDate (String line, Date refDate) {        
    try {
        Date logTimeStamp = logTimeStampFormat.parse(line);
        logTimeStamp.setYear(2012);      // But this is deprecated!
        return logTimeStamp.after(refDate);
    } catch (ParseException e) {
        // Handle exception
    }        
}

为避免使用弃用的方法,我喜欢这样:

private static final SimpleDateFormat logTimeStampFormat = 
    new SimpleDateFormat("MMM dd HH:mm:ss.SSS");

private static Calendar cal = Calendar.getInstance();

boolean isAfterRefDate (String line, Date refDate) {
    try {
        Date logTimeStamp = logTimeStampFormat.parse(line);
        cal.setTime(logTimeStamp);
        cal.set(Calendar.YEAR, 2012);
        logTimeStamp = cal.getTime();            
        return logTimeStamp.after(refDate);
    } catch (ParseException e) {
        // Handle exception
    }        
}

我只是不认为这是解决这个问题的最佳方法。我必须首先正确设置日历对象,然后从中获取日期对象,而我可以直接修改日期对象。

有人可以提出更好的方法吗?

2 个答案:

答案 0 :(得分:5)

  

有人可以提出更好的方法。

当然 - 尽量避免首先使用DateCalendar。请改用Joda Time,这样会好得多。

Date上设置年份本身就是一个模棱两可的操作 - 今年的时区是什么意思?如果您在2012年2月29日的前一天设定了2013年的一年,您会发生什么?

使用Joda Time可以使您的代码更加清晰,无论您真正期待什么样的数据。如果您确实需要,您可以随时在API边界转换为DateCalendar

答案 1 :(得分:1)

java.time

  

有人可以提出更好的方法吗?

是的,请使用java.time类。

Answer by Jon Skeet是正确的,但现在已经过时,因为Joda-Time团队建议迁移到java.time类。

MonthDay& LocalTime

我们可以将该输入字符串解析为两个单独的对象,MonthDayLocalTime。第一个显然是一个月和一个月,但没有任何一年,所以它不是一个完整的日期。第二个代表一个时间,但没有任何日期,没有任何时区。

String input = "Sep 21 12:34:56.123";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM dd HH:mm:ss.SSS" );

MonthDay md = MonthDay.parse ( input , f );
LocalTime lt = LocalTime.parse ( input , f );

System.out.println ( "md: " + md + " | lt: " + lt );
  

md: - 09-21 | lt:12:34:56.123

LocalDateTime

我们可以在一年内添加,一起搅拌,然后获得LocalDateTime

LocalDateTime ldt = LocalDateTime.of( ld , lt );

ZonedDateTime

这仍然不是一个实际的时刻,而不是时间轴上的一个点。如果没有从UTC或时区偏移的上下文,LocalDateTime没有意义。

应用ZoneId获取ZonedDateTime。现在我们有一个有意义的时刻,时间轴上的一个点。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );
相关问题