JavaとiCalendarでの作業

少し前まで、 iCalendarから必要な情報を解析して出力する必要がありました。 ハード検索の後、 iCal4Jライブラリに出会いました。 その機能を見て、私はこれが私が必要なものであることに気づきました。 それを実践してみましょう。

カレンダーの準備

Googleカレンダーでは、30分から6時間続くさまざまなイベントで構成される小さなカレンダーを作成しました。 次に、iCalカレンダーをラップトップにダウンロードしました。 誰も知らない場合、これは次のように行われます。Googleカレンダー設定に移動し、「閉じたカレンダーのアドレス」セクションの緑色のボタン「ICAL」をクリックします。 それだけです、カレンダーはデバイスにアップロードされます。

Javaの準備

次のステップは、ライブラリをダウンロードしてプロジェクトに接続することでした。 展開して、開発環境に* .jarライブラリファイルのあるフォルダーを示しました。 また、ダウンロードしたカレンダーファイルがプロジェクトフォルダーにコピーされました。 すべてのコードを書く準備ができました!

カレンダーをダウンロード

カレンダーをロードするための2つのオプションがあります-ファイルから、カレンダーの内容を含む行を解析します。 最初の方法を選択します(2番目の方法は大きく異なりません)。

//      FileInputStream fin = new FileInputStream("calendar.ics"); //          Calendar CalendarBuilder builder = new CalendarBuilder(); Calendar calendar = builder.build(fin); 


すべてのイベントの結論

次に、カレンダーからすべてのイベントをどこかに(少なくともコンソールに)取得しようとします。

 //    ComponentList listEvent = calendar.getComponents(Component.VEVENT); for (Object elem : listEvent) { //         ,   listEvent   Object VEvent event = (VEvent) elem; //   // getValue()   ,    .   getName()  toString()       DESCRIPTION String description = event.getDescription().getValue(); //    String title = event.getSummary().getValue(); System.out.println(title + " : " + description); } 

最初の行、つまりComponent.VEVENTに注意する価値があります。 したがって、正確にカレンダーイベントを受信することを示します。 カレンダーから抽出するものを明示的に指定しない場合、To-Doコンポーネント(VTODO)、メモ(VJOURNAL)、およびVFREEBUSY、VALARM、VTIMEZONEなどの他のコンポーネントも含むリストを取得します。

フィルターを適用する

私の場合、特定の期間内の要素を表示するために、フィルターを適用できます。

 java.util.Calendar today = java.util.Calendar.getInstance(); today.set(java.util.Calendar.HOUR_OF_DAY, 0); today.clear(java.util.Calendar.MINUTE); today.clear(java.util.Calendar.SECOND); //     1  Period period = new Period(new DateTime(today.getTime()), new Dur(1, 0, 0, 0)); //      Filter filter = new Filter(new PeriodRule(period)); //     List eventsToday = filter.filter(calendar.getComponents(Component.VEVENT)); // ,  eventsToday   ,     


執筆時点で、そのような記録は私のカレンダーに保存されていました(「タイトル」:「説明」[「開始時間」]の形式):
イベント1:イベント1-11月1日[2013年11月7日13:00:00 GMT]
イベント5:イベント5-11月12日[2013年11月12日12:00:00 GMT]
イベント3:イベント3-11月10日[2013年11月10日19:30:00 GMT]
イベント2:イベント2-11月9日[2013年11月9日08:30:00 GMT]
イベント4:イベント4-11月11日[2013年11月11日08:00:00 GMT]
イベント6:イベント6-11月13日[2013年11月13日09:30:00 GMT]

予定されたイベントの結論にフィルターを適用した後(11月11日)、イベント4のみを受信しました:
イベント4:イベント4-11月11日[2013年11月11日08:00:00 GMT]

期間を3日間に増やす...
 Period period = new Period(new DateTime(today.getTime()), new Dur(3, 0, 0, 0)); 

...私はこの写真を手に入れました:
イベント5:イベント5-11月12日[2013年11月12日12:00:00 GMT]
イベント4:イベント4-11月11日[2013年11月11日08:00:00 GMT]
イベント6:イベント6-11月13日[2013年11月13日09:30:00 GMT]


空のカレンダーを作成する

iCal4jは、カレンダーを最初から作成することもサポートしています。 ここではすべてが簡単です。 カレンダーオブジェクトを作成し、必要なフィールドを追加します。

 Calendar calendar = new Calendar(); calendar.getProperties().add(new ProdId("-//habrahabr")); calendar.getProperties().add(Version.VERSION_2_0); calendar.getProperties().add(CalScale.GREGORIAN); 


カレンダーに新しいイベントを追加します

しかし、イベントの作成では、すべてがそれほど単純ではありませんが、それを把握すれば、すべてが十分に迅速に進みます。

 //    TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry(); TimeZone timezone = registry.getTimeZone("Europe/Minsk"); VTimeZone tz = timezone.getVTimeZone(); //  10   18:00 java.util.Calendar startDate = new GregorianCalendar(); startDate.setTimeZone(timezone); startDate.set(java.util.Calendar.MONTH, java.util.Calendar.NOVEMBER); startDate.set(java.util.Calendar.DAY_OF_MONTH, 10); startDate.set(java.util.Calendar.YEAR, 2013); startDate.set(java.util.Calendar.HOUR_OF_DAY, 18); startDate.set(java.util.Calendar.MINUTE, 0); startDate.set(java.util.Calendar.SECOND, 0); //       20:00 java.util.Calendar endDate = new GregorianCalendar(); endDate.setTimeZone(timezone); endDate.set(java.util.Calendar.MONTH, java.util.Calendar.NOVEMBER); endDate.set(java.util.Calendar.DAY_OF_MONTH, 10); endDate.set(java.util.Calendar.YEAR, 2013); endDate.set(java.util.Calendar.HOUR_OF_DAY, 20); endDate.set(java.util.Calendar.MINUTE, 0); endDate.set(java.util.Calendar.SECOND, 0); //   String eventName = "- "; DateTime start = new DateTime(startDate.getTime()); DateTime end = new DateTime(endDate.getTime()); VEvent meeting = new VEvent(start, end, eventName); //        meeting.getProperties().add(tz.getTimeZoneId()); //    Calendar icsCalendar = new Calendar(); icsCalendar.getProperties().add(new ProdId("-//habrahabr")); icsCalendar.getProperties().add(CalScale.GREGORIAN); //      icsCalendar.getComponents().add(meeting); 


カレンダーをファイルに保存する

カレンダーを操作したので、必ず保存する必要があります。 ファイルに保存することをお勧めします。

 FileOutputStream fout = new FileOutputStream("calendar.ics"); CalendarOutputter out = new CalendarOutputter(); out.output(calendar, fout); 


おわりに

iCal4jライブラリの基本機能を調べました。 もちろん、その機能はカレンダーを解析してイベントを作成するだけに限定されません。 このライブラリを使用すると、ファイルをイベントに添付したり、座標で位置を指定してイベントを作成したり、ゲストリストを作成したりすることもできます。 さらに、Androidアプリケーションの開発でライブラリを使用できます。

参照:
  1. iCalendarの説明
  2. ICal4jドキュメント
  3. iCal4j Wiki(ライブラリはこちらからダウンロードすることもできます)

Source: https://habr.com/ru/post/J201660/


All Articles