簡體   English   中英

設置Java日期的年份

[英]Set the year of a java date

我正在嘗試設置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
    }        
}

我只是認為這不是解決此問題的最佳方法。 我必須先正確設置日歷對象,然后再從中獲取日期對象,而之前我可以直接修改日期對象。

有人可以建議更好的方法嗎?

有人可以建議一種更好的方法。

當然-盡量避免首先使用DateCalendar 請改用Joda Time ,這要好得多。

將年份設置為Date本身就是模棱兩可的操作-今年意味着什么時區? 如果您將2012年2月29日定為2013年,那將會發生什么?

使用Joda Time可以使您的代碼在真正期望的數據類型上更加清晰。 如果確實需要,您始終可以在API邊界處與DateCalendar進行相互轉換。

java.time

有人可以建議更好的方法嗎?

是的,請使用java.time類。

Jon Skeet答案是正確的,但是現在已經過時了,因為Joda-Time小組建議遷移到java.time類。

MonthDayLocalTime

我們可以將該輸入字符串解析為兩個單獨的對象,即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 );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM