2012-03-12 88 views
2

你好,我是使用Java中修改週日歷

Calendar我想是要改變我的日曆值,並具有以下/前一週持平。

我試圖

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.DATE, cal.DATE-7); 

但它的行爲古怪

+4

「行爲怪異」是什麼意思? – talnicolas 2012-03-12 16:12:05

+0

它給了我不好的約會,例如,如果我採取行動7,有時它會減少一個月或類似的事情 – joris 2012-03-12 16:14:19

回答

4

你試過(複製/從javadoc粘貼):

cal.add(Calendar.DAY_OF_MONTH, -7); 
+0

它完美的作品讓你 – joris 2012-03-12 16:16:21

0

你必須做這樣的事情:

public static void main(String[] args) { 

    Calendar cal = Calendar.getInstance(); 
    System.out.println(cal.getTime()); 
    cal.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR)-1); 
    System.out.println(cal.getTime()); 
} 

希望這有幫助,玩得開心!

2

你應該使用類似替代以下幾點:

c.add(Calendar.WEEK_OF_YEAR, -1);

你的代碼是完全錯誤的。 cal.DATE-7並不意味着「今天7天前」。 Calendar.DATE只是一個常數,用於指定Calendar的字段類型。

0

tl; dr

下週。

LocalDate.now(ZoneId.of("America/Montreal")) 
     .plusWeeks(1L) 

上週。

LocalDate.now(ZoneId.of("America/Montreal")) 
     .minusWeeks(1L) 

使用java.time

現代的方式是與取代麻煩的老傳統類,如Calendar & Date的java.time類。

LocalDate

LocalDate類表示沒有時間一天和不同時區的日期,唯一的價值。

時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,Paris France午夜後幾分鐘是新的一天,而在Montréal Québec仍然是「昨天」。

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

加/減周

添加或一個LocalDate減去周很容易。致電plusWeeksminusWeeks方法。

LocalDate nextWeek = today.plusWeeks(1L); 
LocalDate lastWeek = today.minusWeeks(1L); 

關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore