1 回答
TA贡献1859条经验 获得超6个赞
避免遗留的日期时间类
永远不要使用Date
或Calendar
类。那些非常麻烦的旧类现在是遗留的,被java.time类所取代,特别是Instant
和ZonedDateTime
. 你也可能会觉得LocalDate
有帮助。
智能对象,而不是哑字符串
切勿在 Java 代码中使用字符串来表示日期时间。使用对象,java.time类。
将日期时间值作为文本交换时,请始终使用标准 ISO 8601 格式。该java.time类解析/生成字符串时,在默认情况下使用这些格式。对于 YYYY-MM-DD 的日期,例如2018-01-23
.
TemporalAdjuster
界面
要跳过周末,使用TemporalAdjuster
中发现的实施ThreeTen-EXTRA项目。
例子:
LocalDate // Represent a date-only value, without a time-of-day and without a time zone.
.now( // Capture the current date.
ZoneId.of( "Africa/Tunis" ) // Time zone required. For any given moment the date varies around the globe by zone.
)
.with( // Invoke a `TemporalAdjuster` implementation.
org.threeten.extra.Temporals.nextWorkingDay()
) // Returns a `LocalDate`. Using immutable objects pattern, producing a fresh object based on the values of another while leaving the original unaltered.
要跳过假期,您必须编写自己的代码。没有两个人、公司或国家对假期有相同的定义。
您需要定义自己的假期列表。我建议将其编写为TemporalAdjuster
与java.time类一起工作的实现。也许nextBusinessDay
和previousBusinessDay
。这ThreeTen-EXTRA项目上面提到的是开源的,所以看看那里的代码来指导你。我依稀记得TemporalAdjuster
在 Stack Overflow 上发布了我自己的一个或多个实现。
您可以将这些假期日期存储在数据库中以保持持久性。并在运行时按时间顺序将它们表示为 a List< LocalDate >
,用 排序Collections.sort
和搜索Collections.binarySearch
。但要注意线程安全。您可能需要在运行时更新该列表。阅读时写作必须受到保护。搜索更多信息。并阅读Brian Goetz 等人的优秀著作Java Concurrency in Practice。
您可以将假期跳过代码与周末跳过代码结合使用。使用搜索引擎在周末跳过使用EnumSet
和DayOfWeek
枚举找到我的答案。(不幸的是,Stack Overflow 中内置的搜索功能偏向于问题,而忽略了答案。)
搜索堆栈溢出。所有这些都已经被问过和回答过。
添加回答
举报