gpt4 book ai didi

java - 正确验证同一天内的时间间隔

转载 作者:行者123 更新时间:2023-11-30 02:43:25 24 4
gpt4 key购买 nike

我有一个方法如下:

public void storeAppointment(int year,
int monthOfYear,
int dayOfMonth,
int hourOfDayFrom,
int minuteFrom,
int hourOfDayUntil, int minuteUntil) {

Calendar appointmentCalendar = Calendar.getInstance();
appointmentCalendar.set(year, monthOfYear, dayOfMonth);
TimeZone tz = appointmentCalendar.getTimeZone();
DateTimeZone jodaTz = DateTimeZone.forID(tz.getID());
DateTime appointmentDateTime = new DateTime(appointmentCalendar.getTimeInMillis(), jodaTz);
LocalDate localDate = appointmentDateTime.toLocalDate();

// At this point I have the appointment date.

// Should e.g. throw an exception for invalid time interval
validate(hourOfDayFrom, minuteFrom, hourOfDayUntil, minuteUntil);

// set proper times for calendar
appointmentCalendar.set(Calendar.HOUR, hourOfDay);
appointmentCalendar.set(Calendar.MINUTE, minute);
// store date and times
// Should I update the localDate instead of the appointmentCalendar?
}

问题:

  1. 我应该如何验证小时/分钟?应该包括实际日期还是不相关?

  2. 我应该更新 localDate 而不是 appointmentCalendar 吗?

最佳答案

你在这里工作太辛苦了。

避免遗留日期时间类

避免使用麻烦的旧日期时间类,例如 Date & Calendar 。现在是遗产,被 java.time 类取代。

不要混合日期时间库

不要混合不同的日期时间库。如果使用 Joda-Time,则不需要java.util.Date不需要java.util.Calendar 。如果使用 java.time 类,则不需要 Joda-Time 也不需要 java.util.Date/.Calendar .

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

业务规则

Should the actual date be included or is that not relevant?

我们无法告诉您是否考虑该日期。这取决于您的业务规则。

例如,如果您的企业总是从中午到 13:00 进行午休,那么任何标记有该时间段的业务记录都必须是无效的。如果您每天都采用相同的午休时间,那么日期在这里就无关紧要了。

但是,如果您的场景类似于记录员工的工作时间,那么两个时间段不应在同一天重叠。在这种情况下,您必须考虑日期。

ZonedDateTime

Should I update the localDate instead of the appointmentCalendar?

a) 如上所述,您不应该混合这些类。

b) 在 Joda-Time 和 java.time 中, LocalDate 类表示不含时间的仅日期值。和它的 sibling 一样 Local…类,它故意没有时区的概念。所以根本不适合您的目的。

您需要使用ZonedDateTime表示在您想要的时区内有意义的日期和时间。

指定proper time zone name格式为continent/region ,如 America/Montreal , Africa/Casablanca ,或Pacific/Auckland 。切勿使用 3-4 个字母的缩写,例如 ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld = LocalDate.of( 2016 , 1 , 23 );
LocalTime lt = LocalTime.of( 12 , 30 );
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z );

获取当前时刻:

Instant instant = Instant.now();  // UTC.
ZonedDateTime zdt = instant.atZone( z );

...或者,作为快捷方式...

ZonedDateTime zdt = ZonedDateTime.now( z );

此外,java.time 类是 immutable objects 。所以你不会改变(“变异”)它们的值。相反,您根据原始值实例化一个新对象。

间隔

您可能会找到 Interval 类(class) ThreeTen-Extras项目在这里会有帮助。

Interval a = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );

您可以使用 contains 等方法来比较间隔, overlaps , encloses , isBefore ,和isAfter .

Boolean overlaps = a.overlaps( b );

传递对象

传递对象,而不是仅仅传递零碎数据的基元。

因此,不要传递月份、日期和小时的整数等基元,而是传递 java.time 对象,例如 Instant , OffsetDateTime , ZonedDateTime 。当您只有日期或只有一天中的时间时,请传递 LocalDateLocalTime .

默认时区

要获取 JVM 当前的默认时区,请调用 ZoneId.systemDefault

但如果重要的话,您应该询问用户他们想要/预期的时区。该默认值可以随时被该 JVM 中运行的任何应用程序的任何线程中的任何代码更改。

关于java - 正确验证同一天内的时间间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40947693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com