0

假设我有 2 个以毫秒为单位的日期或 java.sql.Timestamp:

1342162320 <->  Fri Jul 13 2012 09:52:00 GMT+0300 (FLE Daylight Time)
1343162320 <-> Tue Jul 24 2012 23:38:40 GMT+0300 (FLE Daylight Time)

假设我提供了这两个日期,我需要:

返回int,如果JUL 13 09:52 - JUL 24 23:58 之间的时间是周末或大假期,如果是,是多少天。

我想过只是浏览所有日期,并检查它是星期六还是星期天,但也许有一些更聪明的 API?

我也查看了 Joda 库,但它没有专门的这些方法,只有一些简化的 JDK 方法。Joda 没有假期识别。

4

3 回答 3

1

您可以使用来自http://www.calendarlabs.com/ical-calendar-holidays.php的已定义假日日历,它们适用于多个国家/地区。它的格式称为 iCal,由 MS Outlook 使用。为这种格式编写解析器应该不难。然后你就有了“红色”日期,不必定义和更新,只需下载每年的新定义。

也可以从 Google 日历或类似工具中获取假期。

于 2012-07-13T08:05:18.277 回答
0

是的,这很简单,只需按照以下代码:

    Calendar cal = new GregorianCalendar();
    cal.setTime(date);
    //cal.setTimeInMillis(milliseconds); use this one instead if you have milliseconds. 
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
    if(Calendar.SUNDAY == dayOfWeek || Calendar.SATURDAY == dayOfWeek){
        System.out.println("it is saturday or sunday")
   }

这样就可以识别出当天是周六还是周日,但是如果要判断是否是公众假期呢?例如:国定假日,我会说通过JDK是不可能的,因为这非常符合不同的地区或国家,它不是永久性的。

于 2012-07-13T07:51:25.853 回答
0

tl;博士

Boolean isWeekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ).contains ( Instant.ofEpochSecond( 1342162320L ).atZone( ZoneId.of( "Europe/Helsinki" ) ).getDayOfWeek() )

细节

其他答案是正确的,但使用过时的遗留类。请改用 java.time 类。

问题的周末部分很容易使用内置的 Java 库。您可以定义一组周末,例如美国的周六和周日。

涵盖假期需要某种外部库、Web 服务或数据库。假期的定义随着时间、管辖权和传统的不同而不同。我将忽略问题的那一部分;将Kennet 的答案视为一种可能的解决方案。

DayOfWeek

枚举标识一周的DayOfWeek7 天中的每一天。您可以询问 aZonedDateTimeDayOfWeek.

首先解析您输入的数字。似乎是自 1970 年 UTC 第一时刻以来的整秒数。请注意L末尾的 ,以使其成为long整数。

Instant instant = Instant.ofEpochSecond( 1342162320L );

应用时区。

ZoneId zoneId = ZoneId.of( "Europe/Helsinki" );
ZonedDateTime zdt = instant.atZone( zoneId );

通过询问一周中的某一天是星期六还是星期日来测试周末。

DayOfWeek dow = zdt.getDayOfWeek();
Boolean isWeekend = ( dow.equals( DayOfWeek.SATURDAY ) || dow.equals( DayOfWeek.SUNDAY ) );

EnumSet

您还可以使用EnumSet, 来实现快速执行和低内存使用。

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

static final如果它的定义在您的应用程序执行期间没有更改,则将其声明为常量。

static final Set<DayOfWeek> WEEKEND = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );

当你得到一个DayOfWeek对象时,看看它是否包含在 EnumSet 中,它是一个Set接口的实现。

Boolean isWeekend = WEEKEND.contains( dow.getDayOfWeek() );

java.time

java.time框架内置于 Java 8 及更高版本中这些类取代了旧的麻烦的日期时间类,例如java.util.Date, .Calendar, & java.text.SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到 java.time。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。

许多 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP进一步适应Android

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。

于 2016-08-15T00:39:55.430 回答