我们有一个用java编写的系统,它可以向客户端发送iCal事件。
一位客户有一个问题,即从我们的系统发送的所有事件在他们的展望中都延迟了2小时,因为它在iCal(VCALENDAR)内容中指定。
客户保证他们的电脑上正确设置了时区,所以到了中欧时间。我们已经在内部电子邮件客户端上测试了相同的事件,在我们的客户端(主要是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 sestanekn---------------------------------------nsta
tus dogodka: potrjenn---------------------------------------ntrenutno
stanje udeležbe na dogodkun-------------------------------------nPetra
Lunder - nedoločenonSimon Cigoj - nedoločenonVesna 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);
扩展Oberon的答案,要将分区时间放在Icalendar中,您需要一个顶级VTIMEZONE元素,该元素定义时区和时间中的TZID属性,例如DTSTART;TZID=欧洲/布拉格:20140912T100000。在我看来,TZID不应该独自一人,与某个时代无关。
Ical4j应该为你做这件事。请参阅本页。尝试加载时区注册表,如图所示。。。
TimeZoneRegistry registry = builder.getRegistry();
此问题最可能的原因是属性TZID
设置为欧洲/布拉格,但您确实在日历中包含了组件VTIMEZONE
(请参阅RFC5545 3.6.5),它在某些系统上工作的原因是Outlook和其他系统添加了对Olson时区的支持,但这不是RFC标准严格意义上的一部分。