我正在處理一些問題。java日曆 - 獲取最後5天的一週(沒有周末)
我需要從數據庫
1)從去年5天后得到5條記錄(每1天1記錄)得到一些數據,但日內必須是一個星期的日子(現在是週末)
2)得到20條記錄,從該月(當前或過去,每1天1個記錄)
我用Java日曆戰鬥,但我仍然不知道,怎麼去的日期。
有人能幫助我嗎?
我正在處理一些問題。java日曆 - 獲取最後5天的一週(沒有周末)
我需要從數據庫
1)從去年5天后得到5條記錄(每1天1記錄)得到一些數據,但日內必須是一個星期的日子(現在是週末)
2)得到20條記錄,從該月(當前或過去,每1天1個記錄)
我用Java日曆戰鬥,但我仍然不知道,怎麼去的日期。
有人能幫助我嗎?
應該工作:
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;
}
只是踢啓動
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
您可以只通過你想每一天調整的一週參數的一天做第一部分考慮。取決於您在幾周內運行時所需的行爲 - 應該是本週還是最後一週?在這裏,我認爲本週...從當月
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);
myLocalDate.with(
org.threeten.extra.Temporals.previousWorkingDay()
)
其他答案使用麻煩舊日期,時間類,如Calendar
比現在的傳統,由java.time類取代。
爲了得到最後五天,你首先需要得到「今天」。
LocalDate
的LocalDate
類表示沒有時間一天和不同時區的日期,唯一的價值。
時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,Paris France午夜後幾分鐘是新的一天,而在Montréal Québec仍然是「昨天」。
在continent/region
的格式指定一個proper time zone name,如America/Montreal
,Africa/Casablanca
,或Pacific/Auckland
。切勿使用3-4字母縮寫,如EST
或IST
,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。
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());
TemporalAdjuster
previousWorkingDay()
的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 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
,YearQuarter
和more。
是的,請用您的代碼編輯此問題,以便人們可以準確回答您遇到的問題。 – Jasonw 2012-03-07 14:59:23
基本上是[如何將工作日添加到Java中的當前日期?](http://stackoverflow.com/q/1534804/642706) – 2017-02-27 19:46:29