Jai*_*rez 2 java calendar date
我需要实现一个能够计算工作日,当然还有自然日的劳动日历。日历必须能够处理国家假日,并且这些日期必须由用户提交。因此,如果我需要计算两天之间的差异,则计数必须忽略周六、周日和节假日。
Java 类Calendar不处理假期或工作日,所以我需要自己制作。我想到了两种可能的方法:
我可以实现一个新Day类,它有一个布尔值isHoliday来检查这是否是工作日,然后使用我需要处理/计算天数的所有方法创建一个新类。
我对这种方法的疑问是如何存储它。这意味着要创建 365 个对象并将它们存储在Listor中Linked List,这需要处理大量数据。
我的第二个想法是让它变得更简单。创建一个数组Strings或日期来存储假期。示例new ArrayList<String> freeDays = ["01/01/2019", "05/01/2019", "06/01/2019"...]并使用新的 CalendarUtils 类或类似的东西来处理它。
对我来说,第一个选项看起来更好,但是,我不想浪费内存或使用不好的做法。
哪个选项看起来更好?还有第三种选择吗?
切勿使用Date或Calendar类。那些非常麻烦的旧类现在已成为遗留类,被java.time类(特别是Instant和)所取代ZonedDateTime。您可能也会发现LocalDate有帮助。
切勿在 Java 代码中使用字符串来表示日期时间。使用对象,即java.time类。
\n\n将日期时间值交换为文本时,请始终使用标准 ISO 8601 格式。java.time类在解析/生成字符串时默认使用这些格式。对于 YYYY-MM-DD 的日期,例如2018-01-23.
TemporalAdjuster界面要跳过周末,请使用ThreeTen-ExtraTemporalAdjuster项目中的实现。
例子:
\n\nLocalDate // 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. \nRun Code Online (Sandbox Code Playgroud)\n\n要跳过假期,您必须编写自己的代码。没有两个人、公司或国家对假期有相同的定义。
\n\n您\xe2\x80\x99需要定义自己的假期列表。TemporalAdjuster我建议将其编写为与java.time类完美配合的实现。也许nextBusinessDay和previousBusinessDay。上面提到的ThreeTen-Extra项目是开源的,因此请查看那里的代码来指导您。我依稀记得TemporalAdjuster在 Stack Overflow 上发布了我自己的一个或多个实现。
您可以将这些假期日期存储在数据库中以保持持久性。并在运行时按时间顺序将它们表示为 a List< LocalDate >,用 排序Collections.sort并用 搜索Collections.binarySearch。但要注意线程安全。您\xe2\x80\x99 可能需要在运行时更新该列表。读时写必须受到保护。搜索更多信息。并阅读Brian Goetz 等人编写的优秀书籍《Java 并发实践》 。
您可以将假期跳过代码与周末跳过代码结合起来。使用搜索引擎查找我关于周末跳过使用EnumSet和DayOfWeek枚举的答案。(不幸的是,Stack Overflow 内置的搜索功能偏向问题,而忽略答案。)
搜索堆栈溢出。所有这些都已经被问过并回答过。
\n