假设我有两个以毫秒为单位的日期或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。乔达没有假期认可。
您可以使用http://www.calendarlabs.com/ical-calendar-holidays.php定义的假日日历,它们适用于多个国家/地区。它的格式称为iCal,由MS Outlook使用。编写该格式的解析器应该不难。然后你有'红色'日期,不必定义和更新,只需每年下载一个新的定义。
也可以从Google日历或类似日历中获得假期。
是的,这很简单,只需按照以下代码:
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,因为这是非常符合不同地区或国家,它不是永久性的。
Boolean isWeekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ).contains ( Instant.ofEpochSecond( 1342162320L ).atZone( ZoneId.of( "Europe/Helsinki" ) ).getDayOfWeek() )
其他答案是正确的,但使用过时的遗留类。请改用java.time类。
使用内置Java库,问题的周末部分很容易。您可以定义周末的天数集,例如美国的星期六和星期日。
覆盖假期需要某种外部库,Web服务或数据库。假期的定义因时间,管辖权和传统而异。我将无视该问题的那一部分;将Answer by Kennet视为一种可能的解决方案。
DayOfWeek
DayOfWeek
枚举标识了一周七天中的每一天。你可以查询ZonedDateTime
的DayOfWeek
。
首先解析你输入的数字。自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 8及更高版本中。这些类取代了旧的麻烦的日期时间类,如java.util.Date
,.Calendar
和java.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的试验场。