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(ライブラリはこちらからダウンロードすることもできます)



All Articles