计算闹钟的闹钟时间

时间:2016-04-08 07:15:23

标签: java android calendar alarmmanager

我正在尝试制作闹钟应用程序并且很难设置闹钟响起的时间。我的应用程序让用户选择他们希望闹钟响起的日子,类似于android闹钟,其布尔数组为7来表示这一点。

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

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

2 个答案:

答案 0 :(得分:2)

避免旧的日期时间类

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

DayOfWeek enum& EnumMap

DayOfWeek enum为星期一至星期日的七天中的每一天预定义七个对象。

EnumSetEnumMapSetMap的非常快速和低内存的实现,用于处理枚举值的集合。在您的情况下,您可以定义一个包含所有七天的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 );

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

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

您可能会发现ZonedDateTimeInstantDuration类可用于确定下次发出警报之前的经过时间。

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.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

您可以像这样获取当前日期和月份:

Calendar c = Calendar.getInstance();
int day = c.get(Calendar.DAY_OF_MONTH);
int month = c.get(Calendar.MONTH);

和星期几(如星期一,星期二......)

int day = c.get(Calendar.DAY_OF_WEEK);

http://developer.android.com/reference/java/util/Calendar.html#DAY_OF_WEEK