【问题标题】:Java weekend calculator API / LibraryJava 周末计算器 API / 库
【发布时间】:2012-07-13 07:43:51
【问题描述】:

假设我有 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,如果7月13日09:52-7月24日23:58之间的时间是周末或重大节假日,如果是,是多少天。

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

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

【问题讨论】:

  • 假期?你的意思是世界上每个国家都有各种各样的变化?同一个国家的不同宗教怎么办,他们的宗教节日不匹配。
  • @Max 嗯,我的意思是像日历中的红色假期,只有大的。一种全球性的。
  • 看看stackoverflow.com/questions/1044921/…,这可能就是你想要的。
  • 没有“全球”假期。所有这些都是特定于国家/宗教的。还是按照@ortang 的解决方案手动提供“红色”日期列表?
  • 这些数字看起来像是从 1970 年开始的计数,单位为 秒,而不是 毫秒

标签: java date calendar timestamp dayofweek


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

        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")
       }
    

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

    【讨论】:

      【解决方案3】:

      tl;博士

      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 枚举标识一周中的每一天。您可以询问ZonedDateTimeDayOfWeek

      首先解析你输入的数字。似乎是自 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.Calendarjava.text.SimpleDateFormat

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多