gpt4 book ai didi

java - 计算闹钟的闹钟时间

转载 作者:搜寻专家 更新时间:2023-11-01 09:50:18 27 4
gpt4 key购买 nike

我正在尝试制作一个闹钟应用程序,但在设置闹钟响起的时间时遇到困难。我的应用程序让用户选择他们希望闹钟响起的日子,类似于 android 闹钟,用一个包含七个的 boolean 数组来表示。

我的想法是将时钟设置为最近的一天,即如果今天是星期一并且闹钟设置为星期三和星期五,闹钟将在星期三响起,然后在星期五重新设置。

我想知道日历是否可以返回一周,我认为这会让事情变得更容易。

最佳答案

避免使用旧的日期时间类

避免使用麻烦的旧旧日期时间类。而是使用 java.time 类。

DayOfWeek 枚举 & EnumMap

DayOfWeek enum为一周的七天(周一至周日)中的每一天预定义了七个对象。

EnumSetEnumMapSetMap 的非常快速和低内存的实现,用于处理枚举值的集合。在您的情况下,您可以定义一个包含所有 7 天的 EnumMap,每个映射到一个 LocalTime 以指示何时触发警报(或 null 表示当天没有警报)。

EnumMap< DayOfWeek , LocalTime > dowToTimeMap = new EnumMap< DayOfWeek , LocalTime >( DayOfWeek.class );

dowToTimeMap.put( DayOfWeek.MONDAY , LocalTime.of( 6 , 0 ) ); // 6 AM.
dowToTimeMap.put( DayOfWeek.TUESDAY , LocalTime.of( 6 , 0 ) );

dowToTimeMap.put( DayOfWeek.SATURDAY , LocalTime.of( 8 , 0 ) ); // Sleep in until 8 AM on Saturday.
dowToTimeMap.put( DayOfWeek.SUNDAY , LocalTime.of( 7 , 0 ) );

要获取当前日期,请指定时区 ( ZoneId )。 LocalDate类表示没有时间和时区的纯日期值。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

向 map 询问今天星期几的闹钟时间。

LocalTime alarmTimeToday = dowToTimeMap.get( today.getDayOfWeek() );

您可能会找到 ZonedDateTime , Instant , 和 Duration用于确定下一次警报之前耗时的类。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
LocalDate tomorrow = today.plusDays( 1 );
LocalTime alarmTimeTomorrow = dowToTimeMap.get( tomorrow.getDayOfWeek() );
ZonedDateTime nextAlarmZdt = ZonedDateTime.of( tomorrow , alarmTimeTomorrow , z );
Instant now = Instant.now();
Duration duration = Duration.between( now , nextAlarmZdt.toInstant() );

检查持续时间是否为负数,即时间倒退。这意味着下一个警报时间要么早于现在,要么非常接近以致于在此代码运行时到期。

if( duration.isNegative() ) {
// Oops, the next alarm was within a second or so of current time, a shorter time than it took to execute this code.
… // Handle the problem.
}

您还可以验证今天和明天,因为如果此代码在午夜时刻执行,情况可能会发生变化。

然后您可以查询 Duration 整秒、毫秒或纳秒数,无论您的闹钟设置需要什么。


关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

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

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 计算闹钟的闹钟时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36493703/

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