Java 重复事件库

Java 重复事件库,java,android,events,calendar,Java,Android,Events,Calendar,我正在尝试在我的应用程序中实现一个议程功能,但到目前为止,我还没有找到任何库可以帮助我实现这个功能。我读过日历提供商和谷歌日历API,但在他们的文档中没有找到任何关于仅为我的应用程序创建事件的内容 目前,我已经创建了一个数据库,以存储具有以下结构的事件: id - Integer used as primary key for the event; user_id - Integer used to bound the user; start_date - Date of the event;

我正在尝试在我的应用程序中实现一个议程功能,但到目前为止,我还没有找到任何库可以帮助我实现这个功能。我读过日历提供商和谷歌日历API,但在他们的文档中没有找到任何关于仅为我的应用程序创建事件的内容

目前,我已经创建了一个数据库,以存储具有以下结构的事件:

id - Integer used as primary key for the event;
user_id - Integer used to bound the user;
start_date - Date of the event;
end_date - Date with the end of the event's recurrence.
rec_sunday - Boolean if the event reoccurs on sunday.
rec_monday - Boolean if the event reoccurs on monday.
rec_tuesday - Boolean if the event reoccurs on tuesday.
rec_wednesday - Boolean if the event reoccurs on wednesday.
rec_thursday - Boolean if the event reoccurs on thursday.
rec_friday - Boolean if the event reoccurs on friday.
rec_saturday - Boolean if the event reoccurs on saturday.
recurrence - Boolean if the event has recurrence, so I won't need to check for all others booleans.
现在,我只需要一些逻辑来创建ArrayList中的事件和重复事件,以及它们的日期,这样之后我就可以使用比较器以日期为基础对它们进行排序

谢谢你的帮助

更新


多亏了他惊人的回答,我现在正在使用图书馆。这是一个令人惊叹的库,它比我想象的要简单得多。

你有没有考虑过使用iCal4j?它在Maven Central上可用,允许从文件系统上的文件保存/读取日历。使用基于标准的东西的额外好处是,如果将来您想同步到其他日历/日历提供程序,那么(理论上)更容易实现

使用iCal4j可能是一条可行之路

但是直接回答你的问题

java.time 该框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,如
java.util.date
.Calendar
,&
java.text.SimpleDateFormat

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到Java6和Java7,并在中进一步适应Android

DayOfWeek
枚举在这里很方便

Set
的一种特殊实现,它在内部使用位图以非常快速的操作在非常少的内存中表示枚举元素的集合。这里的想法是使用
EnumSet
,而不是使用每周每天的布尔值方法。不需要关于递归的额外布尔值,因为您只需查看
EnumSet
是否包含任何元素即可;没有元素意味着没有重复

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

顺便说一下,在美国,一周从周一开始,周日结束。虽然您可能不想以这种方式向用户展示一周,但我建议您在内部坚持使用该标准。这个星期一到星期天的方法也是
DayOfWeek
enum中定义的顺序

你们班 为
事件定义一个类

public class Event {
    Integer id ;
    Integer user_id ;
    LocalDate start , stop ;
    Set< DayOfWeek > recurrence ; 
}
然后添加项目。从数据库中检索数据时,如果行的SQL布尔列值为TRUE,则可以使用
if
语句在此处调用该方法

recurrence.add( DayOfWeek.MONDAY );
检查集合的大小以查看此事件是否重复发生

Boolean isRecurring = ( recurrence.size() > 0 );
要对对象进行排序,只需将任务委托给
start
成员的
LocalDate
实现即可。我不记得
Comparable
泛型的确切语法,但这里是大致的想法

public class Event implements Comparable {
    …
    @Override
    public int compareTo( Event otherEvent ) {
        return this.start.compareTo( otherEvent.start ) ;
    }
要填充每个事件的循环,请执行类似于此循环的操作

操作日期时间对象以生成新的日期时间对象。(注意复数)类提供了实现,包括我们需要的
next
和/或。
开始
可能需要作为事件包括在内;我将把这种技巧留给读者作为练习。;-)

警告:以上所有代码都未经测试,永远不会运行。就在我头顶上。希望足够让你开始


调度,考虑. 感谢您提供的详细答案,但不幸的是,我不能使用Java8,因为我的项目运行在API 16+设备上。无论如何,你的回答给了我一个很好的起点,所以我搜索了一点,并使用了Joda时间库(根据研究,java.Time的很大一部分是基于Joda时间的)。因此,基本上我是根据开始和结束日期选择数据库中的事件,然后循环遍历它们,检查它们是否重复发生,并根据它们的重复发生规则创建额外的实例。谢谢你的回答!这就定义了java.time是由发明并领导其开发的同一个人领导的。Colbourne和Joda Time团队现在建议迁移到java.Time。Joda Time正在积极维护,但不会收到进一步的重大开发工作。Sry,我跳过了这一部分,谢谢你,我正在使用ThreeTenABP,解决了所有问题并像cham一样工作@BasilBourque我为Android工作,我创建了自定义日历,但不知道如何在自定义日历中管理重复事件,你知道Android的重复事件库吗,我搜索了很多,但没有找到解决方案。

public class Event implements Comparable {
    …
    @Override
    public int compareTo( Event otherEvent ) {
        return this.start.compareTo( otherEvent.start ) ;
    }
if( recurrences.size > 0 ) { // If any recurrences to schedule…
    List<LocalDate> occurrences = new ArrayList<>();
    LocalDate ld = this.start ;
    while ( ld.isBefore( this.stop ) ) {
        for( DayOfWeek dow , this.recurrence ) {
            ld = ld.with( TemporalAdjusters.next( dow ) );
            occurrences.add( ld );
…
if ( Period.between( start , stop ).getYears() > 10 )  {   // If over a decade, halt. 
…