2012-06-01 169 views
4

我需要计算两个日期之间的工作日。 例如:我们在7月4日假期(在美国)。所以如果我的日期是 date1 = 2012年7月3日 date2 = 07/06/2012计算工作日包括假期

没有工作日b/w这些日期应该是1,因为7月4日是假期。

我有一个下面的方法来计算工作日,这将只计算周末而不是假期。 有没有什么方法可以计算假期....请帮助我。

public static int getWorkingDaysBetweenTwoDates(Date startDate, Date endDate) { 
    Calendar startCal; 
    Calendar endCal; 
    startCal = Calendar.getInstance(); 
    startCal.setTime(startDate); 
    endCal = Calendar.getInstance(); 
    endCal.setTime(endDate); 
    int workDays = 0; 

    //Return 0 if start and end are the same 
    if (startCal.getTimeInMillis() == endCal.getTimeInMillis()) { 
     return 0; 
    } 

    if (startCal.getTimeInMillis() > endCal.getTimeInMillis()) { 
     startCal.setTime(endDate); 
     endCal.setTime(startDate); 
    } 

    do { 
     startCal.add(Calendar.DAY_OF_MONTH, 1); 
     if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY 
     && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { 
      ++workDays; 
     } 
    } while (startCal.getTimeInMillis() < endCal.getTimeInMillis()); 

    return workDays; 
} 
+0

你需要跟踪手动假日的知识,AFAIK没有内置的功能。另外,谁最近在java中使用do-while? –

+0

首先,您需要一年中的所有假期列表,因为没有java类(即'Locale'特定类)提供此功能。然后你需要找出这个列表中有多少个落在指定的日期之间,这是相当直接的。然后,您可以从上述代码的结果中删除那么多天。 – WickeD

+0

感谢您的回复。比方说,如果我有一个列表包含所有的假期,你可以建议我如何使用该列表或如何检查条件中的列表日期。 – ran

回答

6

让我们假装你有一个包含所有假期的列表,正如你所提到的。

ArrayList<Integer> holidays = ... 

只需添加一个条件,你if条件的do-while

do { 
      startCal.add(Calendar.DAY_OF_MONTH, 1); 
      if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY 
      && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY 
      && !holidays.contains((Integer) startCal.get(Calendar.DAY_OF_YEAR))) { 
       ++workDays; 
      } 
} while (startCal.getTimeInMillis() < endCal.getTimeInMillis()); 

为了简便起见,我假定holiday包含格式相同Calendar.DAY_OF_YEAR日期。

+0

非常感谢你......我不知道我是如何错过了这个简单的逻辑。但在这里而不是Calendar.DAY_OF_YEAR,我将它与Calendar.getTime()进行比较以返回完整日期。它现在工作正常 – ran

+0

干杯,很高兴成为服务。 – SimplyPanda

+0

值得注意的是,这里的两个例子将计算1毫秒或更多的差异。改为在循环中使用day_of_year和year比较。 – Eddie

1

我没有任何代码样本或类似的东西,但我做了一些搜索,为您和跨越这个堆栈溢出线程有一些链接到Web服务,可以返回的度假日期为你,来到这可以帮助你得到你需要的是:National holiday web service

在该线程链接到本网站服务顶端回答:http://www.holidaywebservice.com/

我不知道,如果使用网络服务的这种类型的事情是矫枉过正或不,但肯定有更好的方法。我很抱歉,我不是最有经验的程序员,所以我不能尽我所能地帮助你。

+1

这不是真的矫枉过正。您需要从* somewhere *其他地方获取信息,因为它总是会发生变化。 – djechlin

1

Nager.Date

可以使用Nager.Date项目JSON API。它支持美国,加拿大和欧洲。每年可用的数据可以将信息保存在您自己的数据库中。

//https://github.com/FasterXML/jackson-databind/ 
ObjectMapper mapper = new ObjectMapper(); 
MyValue value = mapper.readValue(new URL("http://date.nager.at/api/v1/get/US/2017"), PublicHoliday[].class); 

PublicHoliday.class

public class PublicHoliday 
{ 
    public String Date; 
    public String LocalName; 
    public String Name; 
    public String CountryCode; 
    public Boolean Fixed; 
    public Boolean CountyOfficialHoliday; 
    public Boolean CountyAdministrationHoliday; 
    public Boolean Global; 
    public String[] Counties; 
    public int LaunchYear; 
} 

检索例JSON数据。

[ 
    { 
    "date": "2017-01-01", 
    "localName": "New Year's Day", 
    "name": "New Year's Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": true, 
    "counties": null, 
    "launchYear": null 
    }, 
    { 
    "date": "2017-01-16", 
    "localName": "Martin Luther King, Jr. Day", 
    "name": "Martin Luther King, Jr. Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": true, 
    "counties": null, 
    "launchYear": null 
    }, 
    { 
    "date": "2017-01-20", 
    "localName": "Inauguration Day", 
    "name": "Inauguration Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": false, 
    "counties": [ 
     "US-DC", 
     "US-LA", 
     "US-MD", 
     "US-VA" 
    ], 
    "launchYear": null 
    }, 
    { 
    "date": "2017-02-20", 
    "localName": "Washington's Birthday", 
    "name": "Presidents' Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": true, 
    "counties": null, 
    "launchYear": null 
    }, 
    { 
    "date": "2017-05-29", 
    "localName": "Memorial Day", 
    "name": "Memorial Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": true, 
    "counties": null, 
    "launchYear": null 
    }, 
    { 
    "date": "2017-07-04", 
    "localName": "Independence Day", 
    "name": "Independence Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": true, 
    "counties": null, 
    "launchYear": null 
    }, 
    { 
    "date": "2017-09-04", 
    "localName": "Labor Day", 
    "name": "Labor Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": true, 
    "counties": null, 
    "launchYear": null 
    }, 
    { 
    "date": "2017-09-09", 
    "localName": "Columbus Day", 
    "name": "Columbus Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": false, 
    "counties": [ 
     "US-AL", 
     "US-AZ", 
     "US-CO", 
     "US-CT", 
     "US-DC", 
     "US-GA", 
     "US-ID", 
     "US-IL", 
     "US-IN", 
     "US-IA", 
     "US-KS", 
     "US-KY", 
     "US-LA", 
     "US-ME", 
     "US-MD", 
     "US-MA", 
     "US-MS", 
     "US-MO", 
     "US-MT", 
     "US-NE", 
     "US-NH", 
     "US-NJ", 
     "US-NM", 
     "US-NY", 
     "US-NC", 
     "US-OH", 
     "US-OK", 
     "US-PA", 
     "US-RI", 
     "US-SC", 
     "US-TN", 
     "US-UT", 
     "US-VA", 
     "US-WV" 
    ], 
    "launchYear": null 
    }, 
    { 
    "date": "2017-11-10", 
    "localName": "Veterans Day", 
    "name": "Veterans Day", 
    "countryCode": "US", 
    "fixed": false, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": true, 
    "counties": null, 
    "launchYear": null 
    }, 
    { 
    "date": "2017-12-23", 
    "localName": "Thanksgiving Day", 
    "name": "Thanksgiving Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": true, 
    "counties": null, 
    "launchYear": 1863 
    }, 
    { 
    "date": "2017-12-25", 
    "localName": "Christmas Day", 
    "name": "Christmas Day", 
    "countryCode": "US", 
    "fixed": true, 
    "countyOfficialHoliday": true, 
    "countyAdministrationHoliday": true, 
    "global": true, 
    "counties": null, 
    "launchYear": null 
    } 
]