处理带有工作日的 Java 日历的最佳方式?

Jai*_*rez 2 java calendar date

我需要实现一个能够计算工作日,当然还有自然日的劳动日历。日历必须能够处理国家假日,并且这些日期必须由用户提交。因此,如果我需要计算两天之间的差异,则计数必须忽略周六、周日和节假日。

Java 类Calendar不处理假期或工作日,所以我需要自己制作。我想到了两种可能的方法:

第一种方式:

我可以实现一个新Day类,它有一个布尔值isHoliday来检查这是否是工作日,然后使用我需要处理/计算天数的所有方法创建一个新类。

优点:

  • 易于操作
  • 我可以重写/创建像 toString、toDate 等方法...

缺点:

  • (也许?)

我对这种方法的疑问是如何存储它。这意味着要创建 365 个对象并将它们存储在Listor中Linked List,这需要处理大量数据。

第二种方式:

我的第二个想法是让它变得更简单。创建一个数组Strings日期来存储假期。示例new ArrayList<String> freeDays = ["01/01/2019", "05/01/2019", "06/01/2019"...]并使用新的 CalendarUtils 类或类似的东西来处理它。

优点:

  • 更具可读性

缺点:

  • 很难合作

对我来说,第一个选项看起来更好,但是,我不想浪费内存或使用不好的做法。

哪个选项看起来更好?还有第三种选择吗?

Bas*_*que 5

避免遗留日期时间类

\n\n

切勿使用DateCalendar类。那些非常麻烦的旧类现在已成为遗留类,被java.time类(特别是Instant和)所取代ZonedDateTime。您可能也会发现LocalDate有帮助。

\n\n

智能对象,而不是哑字符串

\n\n

切勿在 Java 代码中使用字符串来表示日期时间。使用对象,即java.time类。

\n\n

将日期时间值交换为文本时,请始终使用标准 ISO 8601 格式。java.time类在解析/生成字符串时默认使用这些格式对于 YYYY-MM-DD 的日期,例如2018-01-23.

\n\n

TemporalAdjuster界面

\n\n

要跳过周末,请使用ThreeTen-ExtraTemporalAdjuster项目中的实现。

\n\n\n\n

例子:

\n\n
LocalDate                        // Represent a date-only value, without a time-of-day and without a time zone. \n.now(                            // Capture the current date. \n    ZoneId.of( "Africa/Tunis" )  // Time zone required. For any given moment the date varies around the globe by zone. \n)\n.with(                           // Invoke a `TemporalAdjuster` implementation. \n    org.threeten.extra.Temporals.nextWorkingDay() \n)                                // Returns a `LocalDate`. Using immutable objects pattern, producing a fresh object based on the values of another while leaving the original unaltered. \n
Run Code Online (Sandbox Code Playgroud)\n\n

要跳过假期,您必须编写自己的代码。没有两个人、公司或国家对假期有相同的定义。

\n\n

您\xe2\x80\x99需要定义自己的假期列表。TemporalAdjuster我建议将其编写为与java.time类完美配合的实现。也许nextBusinessDaypreviousBusinessDay。上面提到的ThreeTen-Extra项目是开源的,因此请查看那里的代码来指导您。我依稀记得TemporalAdjuster在 Stack Overflow 上发布了我自己的一个或多个实现。

\n\n

您可以将这些假期日期存储在数据库中以保持持久性。并在运行时按时间顺序将它们表示为 a List< LocalDate >,用 排序Collections.sort并用 搜索Collections.binarySearch。但要注意线程安全。您\xe2\x80\x99 可能需要在运行时更新该列表。读时写必须受到保护。搜索更多信息。并阅读Brian Goetz 等人编写的优秀书籍《Java 并发实践》 。

\n\n

您可以将假期跳过代码与周末跳过代码结合起来。使用搜索引擎查找我关于周末跳过使用EnumSetDayOfWeek枚举的答案。(不幸的是,Stack Overflow 内置的搜索功能偏向问题,而忽略答案。)

\n\n

搜索堆栈溢出。所有这些都已经被问过并回答过。

\n