簡體   English   中英

通過指定星期幾來獲取下一個日期

[英]Get the next date by specifying the day of week

我需要使用日歷來執行此方法,基本上我得到了星期幾(1、2、3),每個int代表星期幾(星期一,星期二)不是按此順序,但是邏輯是這樣。

我需要獲取星期幾的日期,假設今天是星期一,而用戶選擇Wednsesday,我需要獲取下星期三的日期。

我目前的邏輯是:

calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
                calendar.set(Calendar.HOUR_OF_DAY, hour);
                calendar.set(Calendar.MINUTE, minute);
                dateMatch = calendar.getTime();

星期幾是從slidePicker傳遞過來的,代表星期幾,如果我把Wednseday放給我6,這DAY_OF_WEEK不起作用

盡管您的問題文本僅說要找到dayOfWeek ,但您的代碼還包括一天中的時間,以hourminute的形式。

假設你想要的組合的第一個未來發生,即dayOfWeekhourminute ,這意味着,如果今天是dayOfWeek ,你要么想如果今天一天的時間晚了,或者下周,如果一天的時間早比現在。

您可以這樣做:

int dayOfWeek = Calendar.WEDNESDAY;
int hour      = 10; // 10 AM
int minute    = 0;

Calendar cal = Calendar.getInstance(); // Today, now
if (cal.get(Calendar.DAY_OF_WEEK) != dayOfWeek) {
    cal.add(Calendar.DAY_OF_MONTH, (dayOfWeek + 7 - cal.get(Calendar.DAY_OF_WEEK)) % 7);
} else {
    int minOfDay = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
    if (minOfDay >= hour * 60 + minute)
        cal.add(Calendar.DAY_OF_MONTH, 7); // Bump to next week
}
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

System.out.println(cal.getTime()); // Prints: Wed May 10 10:00:00 EDT 2017

tl; dr

要獲得今天之后的下一個星期三,或者如果已經是星期三,則堅持今天的日期。

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY )  )

java.time

使用現代的java.time類來代替麻煩的舊舊日期時間類,例如Calendar

使用DayOfWeek枚舉對象表示星期一至星期日。 使用智能對象而不是啞整數來表示您的星期幾意圖。 使您的代碼更具自記錄性,確保有效值,並提供類型安全性。

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

時區對於確定日期至關重要。 在任何給定時刻,日期都會在全球范圍內變化。 例如, 法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。

如果未指定時區,則JVM隱式應用其當前的默認時區。 該默認值可能隨時更改,因此您的結果可能會有所不同。 最好將您的期望/期望時區明確指定為參數。

continent/region的格式指定正確的時區名稱 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTIST等3-4個字母的縮寫,因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。

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

使用TemporalAdjuster實現(例如TemporalAdjusters.nextOrSame移動到另一個日期。

TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
LocalDate nextOrSameWednesday = today.with( ta ) ;

如果需要處理瞬間,請使用ZonedDateTime類而不是糟糕的Calendar類。 如上所述,讓TemporalAdjuster做繁重的工作。 但是請記住,如果該日對新日期無效,例如在夏令時(DST)轉換期間,則該日可能會更改

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
ZonedDateTime zdtSameOrNextWednesday = zdt.with( ta ) ;

關於java.time

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

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

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

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

暫無
暫無

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

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