Java周末计算器API /库

问题描述 投票:0回答:3

假设我有两个以毫秒为单位的日期或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 - 7月24日23:58之间的时间是周末或大假期,如果是,那么多少天。

我想过要查看所有日期,检查是星期六还是星期日,但也许是一些更聪明的API?

我也查看了Joda库,但它没有专门的这些方法,只是有一些简化的JDK。乔达没有假期认可。

java date calendar timestamp dayofweek
3个回答
1
投票

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

也可以从Google日历或类似日历中获得假期。


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,因为这是非常符合不同地区或国家,它不是永久性的。


0
投票

tl;dr

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

Details

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

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

覆盖假期需要某种外部库,Web服务或数据库。假期的定义因时间,管辖权和传统而异。我将无视该问题的那一部分;将Answer by Kennet视为一种可能的解决方案。

DayOfWeek

DayOfWeek枚举标识了一周七天中的每一天。你可以查询ZonedDateTimeDayOfWeek

首先解析你输入的数字。自UTC 1970年第一时刻以来,似乎是整秒的计数。注意最后的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.Calendarjava.text.SimpleDateFormat

Joda-Time项目,现在在maintenance mode,建议迁移到java.time。

要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

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

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。

© www.soinside.com 2019 - 2024. All rights reserved.