在一些outlook客户中,最晚显示了2小时的事件

时间:2014-09-05 13:25:05

标签: java outlook icalendar vcalendar ical4j

我们有一个用java编写的系统,它将iCal事件发送给客户端。

一位客户遇到的问题是,从iCal(VCALENDAR)内容中指定,我们系统发送的所有事件都会在他们的展望中显示2小时。

客户保证他们的计算机上的timzone设置正确,所以到中欧时间。我们在内部和客户(主要是Outlook)的电子邮件客户端上测试了相同的事件,事件正确显示。

我们使用iCal4J来构造mime消息。是否有任何参数可以设置为增加事件在不同客户端上的时间准确性?

例如,以下事件的设置时间为10:00至12:00,但我们的客户将其展示为12:00至14:00,在我们的展望中,相同的事件正确显示。

以下是我们的活动正文的一个例子:

From: =?UTF-8?Q?Tanja_Bla=C5=BEi=C4=8D?= <******@****.***>
To: Petra Lunder <******.******@******.***>
Message-ID: <15605406.0.1409569454863.JavaMail."****.*****"@*******>
Subject: test sestankov - testni sestanek 1
MIME-Version: 1.0
Content-Type: text/calendar; method=REQUEST; charset="utf-8"
Content-Transfer-Encoding: 8bit

BEGIN:VCALENDAR
PRODID:-//4pm - Arctur d.o.o.//iCal4j 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTAMP:20140901T110414Z
DTSTART:20140912T100000
DTEND:20140912T120000
SUMMARY:test sestankov - testni sestanek 1
TZID:Europe/Prague
ORGANIZER;CN=Tanja Blažič:mailto:********@***********
LOCATION:
DESCRIPTION:testni sestanek\n---------------------------------------\nsta
 tus dogodka: potrjen\n---------------------------------------\ntrenutno 
 stanje udeležbe na dogodku\n-------------------------------------\nPetra
  Lunder - nedoločeno\nSimon Cigoj - nedoločeno\nVesna Kobal - nedoločeno
\n
SEQUENCE:0
UID:2010250@em_4pm_a
STATUS:CONFIRMED
ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN=Petra Lunder;PARTSTAT=NEEDS-AC
 TION:mailto:******.******@*****.**
 ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN=Simon Cigoj;PARTSTAT=NEEDS-ACT
ION:mailto:******.******@*****.**
 ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN=Vesna Kobal;PARTSTAT=NEEDS-ACT
 ION:mailto:******.******@*****.**
END:VEVENT
END:VCALENDAR

我的java ical4j代码:

    DateTime start = new DateTime(_startDate);
    DateTime end = new DateTime(_endDate);

    //meeting = new VEvent(start, end, StringUtilities.clearLatinLetters(_sumamry));
    meeting = new VEvent(start, end, _sumamry);

    TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
    VTimeZone tz = registry.getTimeZone(LocaleUtil.getTimeZoneID()).getVTimeZone();

    Organizer $organizer = new Organizer(URI.create("mailto:" + _organizerEmail));
    $organizer.getParameters().add(new Cn(_organizerName));
    meeting.getProperties().add($organizer);

    Location $location = new Location(_location);
    meeting.getProperties().add($location);

    Description $description = new Description(_description);
    meeting.getProperties().add($description);

    meeting.getProperties().add(new Sequence(Integer.parseInt(_sequence + "")));

    meeting.getProperties().add(new Uid(_customerEventId));


    calendar = new Calendar();
    // $calendar.getProperties().add(new ProdId("-//Ben Fortuna//iCal4j 1.0//EN"));
    calendar.getProperties().add(new ProdId("-//4pm - Arctur d.o.o.//iCal4j 1.0//EN"));
    calendar.getProperties().add(Version.VERSION_2_0);
    calendar.getProperties().add(CalScale.GREGORIAN);
    calendar.getProperties().add(_method.toIcal4j());
    calendar.getComponents().add(meeting);
    calendar.getComponents().add(tz);

2 个答案:

答案 0 :(得分:1)

扩展Oberron的答案,在Icalendar中放置分区时间,你需要一个顶级的VTIMEZONE元素,在时间中定义时区一个TZID属性,例如。 DTSTART; TZID =欧洲/布拉格:20140912T100000。 TZID不应该坐在它自己身上,与我的眼睛无关。

Ical4j应该为你做这件事。见this page。尝试加载时区注册表,如图所示......

TimeZoneRegistry registry = builder.getRegistry();

答案 1 :(得分:0)

此问题的最可能原因是属性TZID设置为欧洲/布拉格,但您确实在日历中包含了一个组件VTIMEZONEsee RFC5545 3.6.5),原因它在某些系统上运行的是Outlook和其他系统增加了对Olson时区的支持,但这并不是RFC标准的严格意义上的部分。