1

Data:ICal を使用して ICal フィードを生成しようとしていますが、一部のイベントが時間なしで出力されます。000000 の場合、時間は必要ないことを読みましたが、Google カレンダーは時間のないイベントを適切に処理しません。

スクリプトと出力の例を次に示します。出力を UTC タイムゾーンにする必要があります。

#!/usr/bin/perl -w
use strict;
use Date::ICal;
use Data::ICal;
use Data::ICal::Entry::Event;
use DateTime;
use Data::Dumper;

sub get_utc_offset($) {
    my ($orig_tz_str) = @_;

    # Using a set winter date to avoid problems with daylight savings time
    my $utc_compare_datetime = DateTime->new(
        year      => 2012,
        month     => 1,
        day       => 1,
        hour      => 1,
        minute    => 1,
        time_zone => 'UTC'
    );

    my $tz             = DateTime::TimeZone->new(name => $orig_tz_str);
    my $utc_offset     = $tz->offset_for_datetime($utc_compare_datetime);
    my $utc_offset_str = DateTime::TimeZone->offset_as_string($utc_offset);

    return $utc_offset_str;
}

sub add_ical_event($$$$$$) {
    my ($calendar, $start, $end, $summary, $description, $timezone) = @_;
    my $offset   = get_utc_offset($timezone);
    $description = 'none' if (!$description);

    my $event = Data::ICal::Entry::Event->new();
    $event->add_properties(
        summary     => $summary,
        description => $description,
        dtstart     => Date::ICal->new( ical  => $start, offset => $offset )->ical,
        dtend       => Date::ICal->new( ical  => $end,   offset => $offset )->ical,
        dtstamp     => Date::ICal->new( epoch => time                      )->ical
    );
    $calendar->add_entry($event);
}


# Tests
# ----------------------------------------------------------------------------

my $timezone = 'America/New_York';

my $calendar = Data::ICal->new();
$calendar->add_properties(
    method         => "PUBLISH",
    prodid         => "-//Test Cal//NONSGML Calendar//EN",
    'X-WR-CALNAME' => 'Test Cal'
);

my (%events) = (
    1 => {
        summary     => 'Test Shift Tool - Testing Shift',
        description => '',
        start       => '20130828T160000',
        end         => '20130828T190000',
        timezone    => $timezone
    },
    2 => {
        summary     => 'New Member Meeting',
        description => '',
        start       => '20130722T190000',
        end         => '20130722T210000',
        timezone    => $timezone
    },
    3 => {
        summary     => 'public',
        description => '',
        start       => '20130630T130000',
        end         => '20130630T140000',
        timezone    => $timezone
    }
);
foreach my $key (sort keys %events) {
    my $e = $events{$key};
    add_ical_event(
        $calendar,
        $e->{start},
        $e->{end},
        $e->{summary},
        $e->{description},
        $e->{timezone}
    );
}
print $calendar->as_string;

一部のイベントには、時間のない開始日または終了日があることに注意してください。T000000Z を手動で追加すると、それらのイベントが Google カレンダーに正しくインポートされます。すべてのイベントに時間を強制する方法について何か提案はありますか?

BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
PRODID:-//Digital Cheetah//NONSGML Calendar//EN
X-WR-CALNAME:Digital Cheetah
BEGIN:VEVENT
DESCRIPTION:none
DTEND:20130829Z
DTSTAMP:20130823T214317Z
DTSTART:20130828T210000Z
SUMMARY:Test Shift Tool - Testing Shift
END:VEVENT
BEGIN:VEVENT
DESCRIPTION:none
DTEND:20130723T020000Z
DTSTAMP:20130823T214317Z
DTSTART:20130723Z
SUMMARY:New Member Meeting
END:VEVENT
BEGIN:VEVENT
DESCRIPTION:none
DTEND:20130630T190000Z
DTSTAMP:20130823T214317Z
DTSTART:20130630T180000Z
SUMMARY:public
END:VEVENT
END:VCALENDAR
4

1 に答える 1