嗨,我在DB中有四列来存储时间窗口。这将允许用户存储美国东部时间9:00至5:00。
现在我需要在java中解析这些信息。
java.sql.Time startTS = rs.getTime("begin_TIME ");
LocalTime localTime = startTS.toLocalTime();
可以通过以下方式进行抵消: 偏移时间(LocalTime time,ZoneOffset offset)
从我看到我们无法将zoneid转换为zoneoffset,所以我如何将9:00 est(存储在时间和区域列中)从sqlserver转换为java。
DB Table:
begin_TIME time NOT NULL,
begin_TIME_ZONE varchar(5) NOT NULL,
end_TIME time NOT NULL,
end_TIME_ZONE varchar(5) NOT NULL,
在后端我需要检查请求是否在窗口中,请求时间转换为ZonedDateTime,开始和结束需要来自DB:
public boolean compare(ZonedDateTime dateTime, OffsetTime startTime, OffsetTime endTime) {
OffsetTime offsetTime = dateTime.toOffsetDateTime().toOffsetTime();
int start = offsetTime.compareTo(startTime);
int end = offsetTime.compareTo(endTime);
return start >= 0 && end <= 0;
}
答案 0 :(得分:0)
如果我理解您的情况,compare
方法的这种变体应该可以帮助您:
public boolean compare(ZonedDateTime dateTime, LocalTime start, ZoneId startTz,
LocalTime end, ZoneId endTz) {
ZonedDateTime startZonedDateTime = start.atDate(dateTime.toLocalDate()).atZone(startTz);
ZonedDateTime endZonedDateTime = end.atDate(dateTime.toLocalDate()).atZone(endTz);
return (! dateTime.isBefore(startZonedDateTime)) && (! dateTime.isAfter(endZonedDateTime));
}
我正在使用提供的ZonedDateTime
的日期部分来确定是否在夏令时生效的日期进行比较。我选择这样做是因为当时区可能有夏令时时,Java需要一个日期才能将本地时间转换为分区或偏移时间。
可以像在版本中一样比较OffsetTime
(忽略日期)对象,但我发现比较ZonedDateTime
对象更简单一些。它真正做的是比较相应的瞬间,因此即使时区不同,它也能正常工作。
我相信您要为方法提供两个区域ID对象。如果您最终在数据库中将时区存储为America/Toronto
,则可以将其直接输入ZoneId.of()
。
我真的认为你不应该坚持EST
和PST
。它变得太复杂和错误。 Java可以将EST
翻译为-05:00
;这使您无法调整夏令时(它确实将PST
理解为America/Los_Angeles
)。使用现代表格America/Toronto
等。请参阅this question: How to tackle daylight savings using Timezone in java的答案。