TL;博士
java.time.LocalDate.of(2018 , Month.JANUARY , 23) // A date-only class, built into Java 8 and later.
.with(
org.threeten.extra.Temporals.NextWorkingDay() // An implementation of `TemporalAdjuster` available in the ThreeTen-Extra library.
) // Returns a new distinct `LocalDate` object, per the Immutable Objects pattern.
java.time
现代的方法使用java.time类。
定义您的开始和结束日期。 LocalDate
类表示没有时间和不带时区的仅限日期的值。
LocalDate start = LocalDate.of(2018 , Month.JANUARY , 23) ;
LocalDate stop = start.plusMonths(1) ;
定义周末具体地,使用DayOfWeek
的EnumSet
枚举对象。
Set<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY) ;
收集符合我们标准的日期。如果你愿意,你可以优化一下你的List
命中(不要打扰少数)。
int days = (int)ChronoUnit.DAYS.between(start , stop) ;
int weekendDaysEstimate = (int) (ChronoUnit.WEEKS.between(start , stop) * 2) ; // Approximate.
int initialCapacity = (days - weekendDaysEstimate + 7) ; // Adding seven arbitrarily for good measure so I don’t strain my brain worrying about exact number.
List<LocalDate> dates = new ArrayList<>(initialCapacity) ;
循环日期范围的日期,一次增加一天。询问每个日期的星期几是否在我们对周末的定义中找到。
LocalDate ld = start ;
while(ld.isBefore(stop)) {
DayOfeek dow = ld.getDayOfWeek() ;
if(weekend.contains(dow)) {
// Just ignore it.
} else { // If not weekend, we care about this date. Collect it.
dates.add(ld) ;
}
// Setup the next loop.
ld = ld.plusDays(1) ;
}
[2018年1月23日,2018年1月24日,2018年1月25日,2018年1月26日,2018年1月29日,二零一八年一月三十零日,2018-01- 31,2018-02-01,2018-02-02,2018-02-05,2018-02-06,2018-02-07,2018-02-08,2018-02-09,2018-02-12, 2018-02-13,2018-02-14,2018-02-15,2018-02-16,2018-02-19,2018-02-20,2018-02-21,2018-02-22]
通过编写您自己的TemporalAdjuster
实现,您可以简化此语法,并使其易于重复使用。
LocalDate ldNextWorkingDay = ld.with(myNextWorkingDayTemporalAdjuster) ;
哦,等等......有人已经写过这样的调整器。可用于ThreeTen-Extra库,它扩展了java.time类的功能。
实施例。更少的代码,你的意图更清晰。请注意,我们从一开始就减去一天,首先考虑开始日期本身。
LocalDate ld = start.minusDays(1).with(org.threeten.extra.Temporals.NextWorkingDay()) ; // Subtract one day to consider the start date itself.
while(ld.isBefore(stop)) {
dates.add(ld) ;
// Setup the next loop.
ld = ld.with(org.threeten.extra.Temporals.NextWorkingDay()) ;
} ;
请注意,我们的逻辑使用半开式方法来定义一段时间。在这种方法中,开始是,包括,而结尾是独家。这种方法通常是日期处理的最佳实践。
最后,为了得到你的天数,获取LocalDate
命中集合的大小。
int countDays = dates.size() ;
如果你这样做家务活的时间一个巨大的数字,你可以通过在开头和结尾计算分项星期优化,然后计算要乘以2作为调整全周数总天数。但对于大多数应用程序,我想这样的优化不会很重要。
关于java.time
的java.time框架是建立在Java 8和更高版本。这些类代替了日期 - 时间类legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time项目,现在在maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310。
您可以直接使用数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC driver。无需字符串,不需要java.sql.*
类。
从何处获取java.time类?
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
@swap - 不是重复的,因为那个问题是关于乔达的,这个不是。 – 2012-08-03 11:20:26
不是重复的,但“使用乔达和该问题中的代码”是一个有效的答案。 – millimoose 2012-08-03 11:21:33
类似于http://stackoverflow.com/questions/7722117/find-all-saturday-and-sunday-from-given-date-range – keiki 2012-08-03 11:22:14