Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置java日期的年份_Java_Date_Calendar - Fatal编程技术网

设置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的首席营销经理!;)(哦,还有,你所有的答案都很好)