2012-03-07 106 views
0

我正在處理一些問題。java日曆 - 獲取最後5天的一週(沒有周末)

我需要從數據庫

1)從去年5天后得到5條記錄(每1天1記錄)得到一些數據,但日內必須是一個星期的日子(現在是週末)

2)得到20條記錄,從該月(當前或過去,每1天1個記錄)

我用Java日曆戰鬥,但我仍然不知道,怎麼去的日期。

有人能幫助我嗎?

+0

是的,請用您的代碼編輯此問題,以便人們可以準確回答您遇到的問題。 – Jasonw 2012-03-07 14:59:23

+0

基本上是[如何將工作日添加到Java中的當前日期?](http://stackoverflow.com/q/1534804/642706) – 2017-02-27 19:46:29

回答

2

應該工作:

private Calendar workingDaysBack(final Calendar from, final int count) { 
    for (int daysBack = 0; daysBack < count; ++daysBack) { 
     do { 
      from.add(Calendar.DAY_OF_YEAR, -1); 
     } while(isWeekend(from)); 
    } 
    return from; 
} 

private boolean isWeekend(Calendar cal) { 
    return cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || 
      cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY; 
} 
0

只是踢啓動

Calendar cal = Calendar.getInstance();//initilized with current date & time 
Date date = cal.getTime();//returned the current date & time that cal holds 
boolean isMonday = Calendar.MONDAY == cal.get(Calendar.DAY_OF_WEEK);//it will return an integer 

See API Doc for more

1

您可以只通過你想每一天調整的一週參數的一天做第一部分考慮。取決於您在幾周內運行時所需的行爲 - 應該是本週還是最後一週?在這裏,我認爲本週...從當月

Calendar cal = Calendar.getInstance(); 

List<Date> last5Days = new LinkedList<Date>(); 
List<Integer> weekDays = Arrays.asList(Calendar.MONDAY, 
     Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY, 
     Calendar.FRIDAY); 
for (int weekDay : weekDays) { 
    cal.set(Calendar.DAY_OF_WEEK, weekDay); 
    last5Days.add(cal.getTime()); 
} 
System.out.println(last5Days); 

20周天。取決於你想在幾周內想要什麼樣的行爲,而不是跨越月份邊界。在這裏,我已經前進到第一個星期一,然後從那裏加入。

List<Date> last20Days = new LinkedList<Date>(); 
// find first Monday in the month 
for (int i = 1; i <= 31; i++) { 
    cal.set(Calendar.DAY_OF_MONTH, i); 
    if (cal.get(Calendar.DAY_OF_WEEK) == weekDays.get(0)) { 
     break; 
    } 
} 
for (int i = 1; i <= 31; i++) { 
    if (last20Days.size() == 20) { 
     break; 
    } 
    if (weekDays.contains(cal.get(Calendar.DAY_OF_WEEK))) { 
     last20Days.add(cal.getTime()); 
    } 
    cal.add(Calendar.DAY_OF_MONTH, 1); 
} 
System.out.println(last20Days); 
0

TL;博士

myLocalDate.with( 
    org.threeten.extra.Temporals.previousWorkingDay() 
) 

使用java.time

其他答案使用麻煩舊日期,時間類,如Calendar比現在的傳統,由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); 

DayOfWeek

爲了得到前幾天,你可以調用minusDays通過在過去的日期逐漸移動。

LocalDate yesterday = today.minusDays(1); 
LocalDate dayBeforeYesterday = yesterday.minusDays(1); 

您可以通過使用DayOfWeek枚舉測試其日常的周各LocalDate對象。該課程預定了七個對象,每週一個。請注意,這些是真實的對象,而不僅僅是字符串。這裏根本不需要使用字符串。

Boolean isSaturday = myLocalDate.getDayOfWeek().equals(DayOfWeek.SATURDAY); 
Boolean isSunday = myLocalDate.getDayOfWeek().equals(DayOfWeek.SUNDAY); 

EnumSet

一個滑頭,做的是比較的更靈活的方式是與EnumSet,爲枚舉優化的Set的實現,它非常快速執行和使用很少的內存。

EnumSet<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY); 

使用contains來測試你的LocalDate對象的DayOfWeek

Boolean isWeekend = weekend.contains(myLocalDate.getDayOfWeek()); 

ThreeTen-EXTRA TemporalAdjusterpreviousWorkingDay()

ThreeTen-Extra項目擴展java.time類的附加功能。特別是在這裏,我們可以使用它的previousWorkingDay實現TemporalAdjuster接口。

這個調整是硬編碼跳過週六和週日。如果您想要考慮其他星期幾值,您可以編寫自己的實現TemporalAdjuster

的java.time類使用不可變對象。因此,我們不是改變對象上的值(「變異」),而是基於原始值生成一個新的對象。所以在這裏我們稱之爲LocalDate::with,傳遞一個TemporalAdjuster,並生成一個新的LocalDate表示,跳過週六/週日之前的日期。

LocalDate previousWorkingDay = 
    myLocalDate.with( 
     org.threeten.extra.Temporals.previousWorkingDay() 
    ) 
; 

完整的示例

因此,讓我們把這個放在一起。

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

Integer countDaysPrior = 5; 
List<LocalDate> priorWeekdays = new ArrayList<> (countDaysPrior); // Set initial capacity to number of days to be collected. 
LocalDate localDate = today; // Initialize to today. Exclusive, we want only prior days. 
for (int i = 1 ; i <= countDaysPrior ; i ++) { 
    localDate = localDate.with (org.threeten.extra.Temporals.previousWorkingDay()); // Decrement each day into the past, skipping over Saturday/Sunday. 
    priorWeekdays.add (localDate); 
} 

System.out.println ("Weekdays prior to " + today + " are: " + priorWeekdays); 

平日之前2017年2月27日分別是:[2017年2月24日,2017年2月23日,2017年2月22日,2017年2月21日,2017年2月20日]

我想你可以使用Lambdas和Streams使代碼更短。


關於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