簡體   English   中英

Java Calendar.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY),它會向后滾動,轉發還是未知?

[英]Java Calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY), will it roll backwards, forwards or unknown?

假設以下代碼在2009年8月22日(星期六)執行

   Calendar c = Calendar.getInstance();
   c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);

c.get(Calendar.DAY_OF_MONTH)將返回23.我感興趣的條件是將返回14(上周日,而不是下周日)。

是否有與方向相關的規則當DAY_OF_WEEK設置時,日歷將滾動DAY_OF_MONTH/YEAR 如果是這樣,他們是什么?

它應始終保持相同的WEEK_OF_MONTHhttp://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#WEEK_OF_MONTH )。 從文檔:

設置或獲取WEEK_OF_MONTH或WEEK_OF_YEAR字段時,日歷必須將月份或年份的第一周確定為參考點。 一個月或一年的第一周定義為從getFirstDayOfWeek()開始並且至少包含該月或年的getMinimalDaysInFirstWeek()天的最早七天。 周數在第一周之前編號為......,-1,0; 周數為2,3,......跟隨它。 請注意,get()返回的規范化編號可能不同。 例如,特定的日歷子類可以指定一年的第1周之前的一周作為前一年的第n周。

以下公式在[0; 6]范圍內的一周內返回“當前”日

(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek

如果你想要范圍,可以加1 [1; 7]

(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek + 1

dCalendar.get(Calendar.DAY_OF_WEEK)返回的內容

獲取一周中的第一天,從當前日期中減去公式的結果。 以下代碼執行此操作:

final int currentDayOfWeek = (calendar.get(Calendar.DAY_OF_WEEK) + 7 - cal.getFirstDayOfWeek()) % 7;
cal.add(Calendar.DAY_OF_YEAR, -currentDayOfWeek);

實際上,這取決於。 請考慮以下Java代碼。 它實際上非常簡單,我希望它能打印2011-09-18之前的星期一,即2011-09-12:

Calendar calendar = Calendar.getInstance(Locale.GERMANY);
System.out.printf("First day of week: %d%n%n", calendar.getFirstDayOfWeek());

calendar.set(2011, Calendar.SEPTEMBER, 18);
System.out.printf("Starting day: %tF%n", calendar);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.printf("Last monday: %tF%n%n", calendar);

calendar.set(2011, Calendar.SEPTEMBER, 18);
System.out.printf("Starting day: %tF (week %d)%n",
        calendar, calendar.get(Calendar.WEEK_OF_YEAR));
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.printf("Last monday: %tF (week %d)%n", calendar,
        calendar.get(Calendar.WEEK_OF_YEAR));

但實際上結果有點不同:

First day of week: 2

Starting day: 2011-09-18
Last monday: 2011-09-19

Starting day: 2011-09-18 (week 37)
Last monday: 2011-09-12 (week 37)

換句話說,結果取決於我的日歷是否知道我可能對本周感興趣。 如果我查詢WEEK_OF_YEAR ,結果實際上會改變!

使用java.time

現代方法是使用java.time類來取代麻煩的舊遺留日期時間類。

java.time類更容易使用。 特別是,它們消除了問題中提出的模糊性。 您可以明確詢問早期星期日或晚些星期日。

LocalDate類表示沒有時間且沒有時區的僅日期值。

Month enum提供了十幾個預定義的對象,每年對應一個。 這些枚舉對象使用起來更安全,但您可以使用月份的普通數字。 與傳統課程不同,這幾個月有一個合理的編號,1月至12月為1-12。

LocalDate localDate = LocalDate.of( 2009 , Month.AUGUST, 22 );

TemporalAdjuster接口提供對日期時間值的操作。 TemporalAdjusters類(注意復數s )提供了幾個方便的實現。

previousnext調整者不考慮日期本身。 previousOrSamenextOrSame方法返回有問題的日期,如果它確實是所需的星期幾。

DayOfWeek枚舉提供了七個預定義的對象,一個對應於一周中的每一天。

LocalDate previousSunday = localDate.with( TemporalAdjusters.previous ( DayOfWeek.SUNDAY ));
LocalDate previousOrSameSunday = localDate.with( TemporalAdjusters.previousOrSame ( DayOfWeek.SUNDAY ));

LocalDate nextSunday = localDate.with( TemporalAdjusters.next ( DayOfWeek.SUNDAY ));
LocalDate nextOrSameSunday = localDate.with( TemporalAdjusters.nextOrSame ( DayOfWeek.SUNDAY ));

轉儲到控制台。

System.out.println ("localDate: " + localDate + " ( " + localDate.getDayOfWeek ().getDisplayName ( TextStyle.FULL, Locale.US )  + " )");
System.out.println ("previousSunday: " + previousSunday );
System.out.println ("nextSunday: " + nextSunday );

localDate:2009-08-22(星期六)

previousSunday:2009-08-16

nextSunday:2009-08-23


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310

從哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

來自Javadoc

如果日歷字段值中存在任何沖突,則日歷會優先考慮最近設置的日歷字段。 以下是日歷字段的默認組合。 將使用由最近設置的單個字段確定的最新組合。

對於日期字段:

 YEAR + MONTH + DAY_OF_MONTH
 YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
 YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
 YEAR + DAY_OF_YEAR
 YEAR + DAY_OF_WEEK + WEEK_OF_YEAR

我認為這意味着,假設您正在設置星期幾,它將最終與一周中的一周或一周中的一周相結合,以產生實際的日期和時間。

您還應該檢查一周中的第一天。 我也認為它總是星期天,但這取決於當地的設置,在我的情況下,星期一是一周的第一天。 將星期日設置為一周的第一天解決了我的問題。

取決於一周的第一天:

 /**
 * Gets what the first day of the week is; e.g., <code>SUNDAY</code> in the U.S.,
 * <code>MONDAY</code> in France.
 *
 * @return the first day of the week.
 * @see #setFirstDayOfWeek(int)
 * @see #getMinimalDaysInFirstWeek()
 */
public int getFirstDayOfWeek()
{
    return firstDayOfWeek;
}

你可以使用這種方法。

public Integer whichDayOfWeek(Calendar calendar) {
            if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
                return 1;
            } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY) {
                return 2;
            } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY) {
                return 3;
            } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) {
                return 4;
            } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
                return 5;
            } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
                return 6;
            } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                return 7;
            } else {
                return null;
            }
        }

暫無
暫無

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

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