我有以下 24 小时的字符串表示,例如1423和1956
我想检查当前时间(带时区)是否在这对之间
我当前的解决方案使用获取一天中的小时和分钟
int h = Instant.now().atZone(ZoneId.systemDefault()).getHour()
int t = Instant.now().atZone(ZoneId.systemDefault()).getMinute()
Run Code Online (Sandbox Code Playgroud)
从数字创建一个 4 位字符串,并进行字符串比较
我根本不喜欢我的解决方案,这样做的优雅方法是什么?
您可以将时间的字符串表示形式转换LocalTime为如下:
var formatter = DateTimeFormatter.ofPattern("HHmm");
var lowerTime = LocalTime.parse("1423", formatter);
var upperTime = LocalTime.parse("1956", formatter);
Run Code Online (Sandbox Code Playgroud)
然后你可以使用isAfter()/isBefore方法来检查它是否介于两者之间:
var nowTime = LocalTime.now(ZoneId.systemDefault());
boolean inBetween = nowTime.isAfter(lowerTime) && nowTime.isBefore(upperTime);
Run Code Online (Sandbox Code Playgroud)
使用 ZonedDateTime.now() 引用和对 ZonedDateTime#toLocalTime 的后续调用创建一个 LocalTime 对象。然后使用代表小时 (HH) 和分钟 (mm)的模式HHmm创建一个 DateTimeFormatter 对象。然后,您可以使用该模式从开始时间 1423 创建一个 LocalTime,并从该模式创建一个 1956 的结束时间。然后,您可以通过确定当前时间是否在开始时间之后和结束时间之前来创建一个布尔值,表示您的时间是否介于两者之间。
LocalTime time = ZonedDateTime.now().toLocalTime();
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("HHmm");
LocalTime startTime = LocalTime.parse("1423", pattern);
LocalTime endTime = LocalTime.parse("1956", pattern);
boolean between = time.isAfter(startTime) && time.isBefore(endTime);
Run Code Online (Sandbox Code Playgroud)