![](/img/trans.png)
[英]Set Calendar.DAY_OF_WEEK using java.time.DayOfWeek
[英]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_MONTH
( http://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
d
是Calendar.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類更容易使用。 特別是,它們消除了問題中提出的模糊性。 您可以明確詢問早期星期日或晚些星期日。
LocalDate
類表示沒有時間且沒有時區的僅日期值。
Month
enum提供了十幾個預定義的對象,每年對應一個。 這些枚舉對象使用起來更安全,但您可以使用月份的普通數字。 與傳統課程不同,這幾個月有一個合理的編號,1月至12月為1-12。
LocalDate localDate = LocalDate.of( 2009 , Month.AUGUST, 22 );
TemporalAdjuster
接口提供對日期時間值的操作。 TemporalAdjusters
類(注意復數s
)提供了幾個方便的實現。
previous
和next
調整者不考慮日期本身。 previousOrSame
和nextOrSame
方法返回有問題的日期,如果它確實是所需的星期幾。
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 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參閱Oracle教程 。 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310 。
從哪里獲取java.time類?
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
來自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.