2012-08-03 89 views
3

我试图找到使用下面的方法的天数,如何获取给定日期范围内的天数?

public static int findNoOfDays(int year, int month, int day) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(year, month - 1, day); 
     int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
     return days; 
    } 

同样,我首先要给开始日期和结束日期得到的天数,并得到天excluding Saturday and Sunday数。

+0

@swap - 不是重复的,因为那个问题是关于乔达的,这个不是。 – 2012-08-03 11:20:26

+1

不是重复的,但“使用乔达和该问题中的代码”是一个有效的答案。 – millimoose 2012-08-03 11:21:33

+0

类似于http://stackoverflow.com/questions/7722117/find-all-saturday-and-sunday-from-given-date-range – keiki 2012-08-03 11:22:14

回答

5

这里是计算两个日期之间的天数的方法:

private int calculateNumberOfDaysBetween(Date startDate, Date endDate) { 
    if (startDate.after(endDate)) { 
     throw new IllegalArgumentException("End date should be grater or equals to start date"); 
    } 

    long startDateTime = startDate.getTime(); 
    long endDateTime = endDate.getTime(); 
    long milPerDay = 1000*60*60*24; 

    int numOfDays = (int) ((endDateTime - startDateTime)/milPerDay); // calculate vacation duration in days 

    return (numOfDays + 1); // add one day to include start date in interval 
} 

这里是计算的weekent天在指定的时间段数的方法:

private static int calculateNumberOfWeekendsInRange(Date startDate, Date endDate) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(startDate); 

    int counter = 0; 
    while(!calendar.getTime().after(endDate)) { 
     int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); 
     if (dayOfWeek==1 || dayOfWeek==7) { 
      counter++; 
     } 
     calendar.add(Calendar.DAY_OF_MONTH, 1); 
    } 

    return counter; 
} 

编辑:

我改变了最后一个方法,现在它计算的天数不包括周末:

private int calculateNumberOfDaysExcludeWeekends(Date startDate, Date endDate) { 
    if (startDate.after(endDate)) { 
     throw new IllegalArgumentException("End date should be grater or equals to start date"); 
    } 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(startDate); 

    int numOfDays = 0; 
    while(!calendar.getTime().after(endDate)) { 
     int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); 
     if ((dayOfWeek>1) && (dayOfWeek<7)) { 
      numOfDays++; 
     } 
     calendar.add(Calendar.DAY_OF_MONTH, 1); 
    } 

    return numOfDays; 
} 
+0

? – 2012-08-03 11:24:24

+0

我加了第二种方法。我在项目中分别使用它们。但是你可以将它们结合起来,写出一种计算你需要的方法。 – dimas 2012-08-03 11:26:49

+0

这将包括周六和周日。你应该改变 if(dayOfWeek == 1 || dayOfWeek == 7){ 到 if(dayOfWeek!= Calendar.SATURDAY && dayOfWeek!= Calendar.SUNDAY){ – 2012-08-03 11:27:56

0
get every day except weekend or Saturday or Sunday between two dates. 

解决方案:

使用乔达时间

public static void main(String[] args) { 
    final LocalDate start = LocalDate.now(); 
    final LocalDate end = new LocalDate(2012, 1, 14); 

    LocalDate weekday = start; 

    if (start.getDayOfWeek() == DateTimeConstants.SATURDAY || 
      start.getDayOfWeek() == DateTimeConstants.SUNDAY) { 
     weekday = weekday.plusWeeks(1).withDayOfWeek(DateTimeConstants.MONDAY); 
    } 

    while (weekday.isBefore(end)) { 
     System.out.println(weekday); 

     if (weekday.getDayOfWeek() == DateTimeConstants.FRIDAY) 
      weekday = weekday.plusDays(3); 
     else 
      weekday = weekday.plusDays(1); 
    } 
} 
1

如果你想获得数星期六和星期日除外您可以计算两个日期之间的星期数,我们称其为num_of_weeks,这也将是两个日期之间的周末数。然后从两个日期之间的天数中减去(num_of_weeks * 2)。

1

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) ; 

定义周末具体地,使用DayOfWeekEnumSet枚举对象。

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,YearQuartermore

相关问题