设置java日期的年份
我正在尝试设置设置java日期的年份,java,date,calendar,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 logTimeS
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
}
}
我只是不认为这是解决这个问题的最好办法。我必须首先正确设置日历对象,然后从中获取日期对象,而之前我可以直接修改日期对象
有人能提出更好的方法吗
有人能提出更好的方法吗
当然-首先尽量避免使用日期
和日历
。改用,这样更好
将年份设置为日期
本身就是一个模棱两可的操作-今年的时区是什么?如果你将2013年定为2012年2月29日,你预计会发生什么
使用Joda Time将使您的代码更清楚地了解您真正期望的数据类型。如果确实需要,您可以随时在API边界转换为日期和日历。java.time
有人能提出更好的方法吗
是的,使用这些类
这是正确的,但现在已经过时了,因为Joda Time团队建议迁移到java.Time类
MonthDay
和LocalTime
我们可以将该输入字符串解析为两个独立的对象,一个是MonthDay
,另一个是LocalTime
。第一个很明显是一个月和一个月中的一天,但没有任何年份,因此它不是一个完整的日期。第二个表示一天中的某个时间,但没有任何日期和时区
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 );
ZoneDateTime
这仍然不是一个实际的时刻,也不是时间线上的一个点。如果没有UTC偏移量或时区的上下文,则LocalDateTime
没有任何意义
应用ZoneId
以获取zoneDateTime
。现在我们有了一个有意义的时刻,时间线上的一个点
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );
很长一段时间以来,您一直在寻找答案,看起来您是java time的首席营销经理!;)(哦,还有,你所有的答案都很好)