假期 - 是否有Java实现?

64

我想知道是否有一个可以执行以下操作的jar文件:

DateMidnight dateInQuestion = new DateMidnight(12,12,2000);
DateChecker.isNationalHoliday(dateInQuestion, Locale.ITALY);

如果没有这样的东西,为什么呢?肯定会有99%的时间里有很多正确的节假日规则。

现在我们正在维护一个数据库表,包括各个国家,对于不在每年相同日期的节假日,我们有一些实现。每当我们获得新客户的时候,就需要为每个新国家添加到我们的实现中。

我们是否能以更简单的方式完成这个任务?

(如果 Java 领域中没有这样的工具,我能从其他语言移植它吗?)


2
这可能对你有用:http://www.javaworld.com/javaworld/javatips/jw-javatip44.html?page=1 这不是一个漂亮包装的JAR文件,否则我会将其作为评论而不是答案,但最后两页有相当多的示例代码。 - Pops
3
据我所知,大多数(至少是当地的)节日在几年前就已经确定了,但并不一定基于静态规则,存在许多例外和可能的调整。 - poke
4
不会那么简单。假期会因地区而异。加拿大各省份的节日不同。苏格兰的节日与英格兰和威尔士也不同。节日的定义也有所不同。有时连时区都要在几周前才能确定。我相信一些国家会根据即时政治状况来宣布假期。 - Tom Hawtin - tackline
1
类似但不是重复的问题:https://dev59.com/3nNA5IYBdhLWcg3wPLH- - Pops
如果我没记错的话,几年前英国议会改变了一个公共假日的日期。结果发现日历和日记印刷商没有仔细阅读汉萨德记录,不得不废弃他们的产品,因为日期错误。 - Tom Hawtin - tackline
显示剩余4条评论
8个回答

18

我编写了Jollyday API,想知道它有什么“粗糙”的地方。我该如何改进?很高兴收到你的来信。如果你愿意,请给我发送电子邮件至sdiedrichsen@yahoo.de。

顺便说一句,Jollyday的使用方式与提问者要求的方式完全相同。请自行查看。

致敬,Sven

P.S.:我发现Ulrich Hilger提供了一个免费的网络服务,可以提供详细的全球假日信息。请看api.daybase.eu。


2
你应该包含一个指向jollyday的链接。 - Nathan Feger
Jollyday允许定义临时公共假期吗?在英国,我们因为2011年的皇家婚礼和2012年女王钻石庆典而放假。这些假期只会偶尔发生,因此Jollyday需要足够灵活以适应这种情况。最好不需要重新启动系统。 - mrswadge

14
据我所知,Java中不存在任何强有力的内容。这也是有道理的,这种信息对于变化非常敏感。硬编码可能会导致您的代码在每次Java更新时潜在地出现故障,从而导致大量维护和兼容性问题。目前,在Java SE中最高的时区是硬编码/维护的,即使仅仅如此,也已经导致了许多错误
最好使用公共Web服务。例如http://www.bank-holidays.com

该网站通知您所有银行(以及一些国家的证券交易所和学校假期)因宗教或公共事件而关闭的日子。 还列出了主要事件(选举,宣布罢工,贸易展览,节日,体育赛事...)。

我们的免费服务允许您查看当前的日历年(仅限查看)。 对于每个国家/年,我们的付费服务(单击信用卡图标)可让您访问2000-2070年的日历年。

然后编写一个Java包装器。或者寻找现有的Java API,这些API已经由Web服务支持。

3
令人印象深刻。我快速核对了一下,他们找到了有关荷兰(我的国家)的所有内容,包括每五年庆祝一次的那个。 - Willem van Rumpt
这看起来好像是唯一的方法。当然,这仍然不普遍,因为有些地方可能会有其他假期,或者替代节日。我在一家大型美国公司工作,他们只是额外提供了 10 天浮动个人假期,这更符合 PC,因为并非每个人都想要圣诞节休息。有些公司在圣诞节和新年之间关闭。 - Romain Hippeau

5

4
我发现这个很有趣:
RESTful服务提供商 - Holiday API 适用于Node项目 - node-holidayapi 我知道这与Java实现的问题无关。但是,如果您的项目是RESTful(像大多数现代项目一样),那么这将为您提供一个起点。 ;)

1
我已经为这个API编写了一个Java客户端库 https://github.com/agogs/java-holiday-api/ - Rakesh

2
我的搜索结果有两个(除了我在评论中列出的)。第一个是Holiday Client API,看起来是一个已经停止更新的项目。第二个是Jollyday,看起来还在积极开发中,但仍有许多问题需要解决。
至于为什么没有好的库可用,我和Tom的想法一样。我怀疑你的前提“在99%的情况下,假期的规则都是正确的”是不正确的。

0
你可以使用我的假期API,还有一个Docker容器可用于运行整个项目。

https://github.com/nager/Nager.Date

Web服务

获取2000年意大利的公共假期 https://date.nager.at/api/v2/PublicHolidays/2000/IT 您可以在这里找到有关可用API方法的更多信息。

Java示例

//https://github.com/FasterXML/jackson-databind/
ObjectMapper mapper = new ObjectMapper();
MyValue value = mapper.readValue(new URL("https://date.nager.at/api/v2/PublicHolidays/2000/IT"), PublicHoliday[].class);

PublicHoliday.class

public class PublicHoliday
{
    public String Date;
    public String LocalName;
    public String Name;
    public String CountryCode;
    public Boolean Fixed;
    public Boolean Global;
    public String[] Counties;
    public String Type;
}

获取的示例JSON数据

[
    {
        "date": "2000-01-01",
        "localName": "Capodanno",
        "name": "New Year's Day",
        "countryCode": "IT",
        "fixed": true,
        "global": true,
        "counties": null,
        "type": "Public"
    },
    ...
]

0

我认为你必须自己完成这项工作。

国家假期是由各个国家决定的。它们可能会改变,并且根据定义,不是普遍适用的,因此无法通过某些算法捕捉。

唯一跟踪它们的方法是在每个国家上维护它们。

也许有人已经这样做了(也许是某种网络服务),但说实话,我怀疑这一点。


1
是的,这就是我担心的事情。最简单的方法是每年维护一次存储库。整个世界只需要5个维护人员,并且版本号将是该年份。 - Espen Schulstad

0

到目前为止,我还没有看到任何相关的东西。 但是我可以建议您尝试连接Google日历API,从那里通过日历订阅或其他方式获取假期日历。 从那里,处理数据,如果需要,将其保存到您的数据库中。 毕竟,只要您有活动的互联网连接,就可以使用Java连接到相关数据。 即使对于其他语言,我认为也没有这样直接的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接