我正在使用Java代码创建会议请求,并将其发送到Outlook的完整版和精简版,如下所示:
final SimpleDateFormat iCalendarDateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmm'00'");
final long uid =System.currentTimeMillis();
iCalendarDateFormat.setTimeZone(TimeZone.getTimeZone(MRBSConstants.TIMEZONE));
final String calendarContent = "BEGIN:VCALENDAR\n"
+ "METHOD:REQUEST\n"
+ "PRODID: BCP - Meeting\n"
+ "VERSION:2.0\n"
+ "BEGIN:VEVENT\n"
+ "DTSTAMP:"+ iCalendarDateFormat.format(meetingEndTime) + "\n"
+ "DTSTART:" + iCalendarDateFormat.format(meetingStartTime) + "\n"
+ "DTEND:"+ iCalendarDateFormat.format(meetingEndTime) + "\n"
+ "SUMMARY:test request\n"
+ "UID:" + uid + "\n"
+ "ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE:MAILTO:" + Arrays.toString(recipetList) + "\n"
+ "ORGANIZER:MAILTO:" + from+ "\n"
+ "LOCATION:" +loc + "\n"
+ "DESCRIPTION:" + body+ "\n"
+ "SEQUENCE:0\n" + "PRIORITY:5\n" + "CLASS:PUBLIC\n" + "STATUS:CONFIRMED\n" + "TRANSP:OPAQUE\n" + "BEGIN:VALARM\n"
+ "ACTION:DISPLAY\n" + "DESCRIPTION:REMINDER\n" + "TRIGGER;RELATED=START:-PT00H15M00S\n" + "END:VALARM\n" + "END:VEVENT\n" + "END:VCALENDAR";
并且它与Outlook的精简版一起工作正常,这意味着它在lite版本中提供了正确的时间,但在Outlook的完整版中却显示了不同的时间。为什么
这里MRBSConstants.TIMEZONE的值为GMT-5:30。
我也尝试添加VTIMEZONE COMPONENT,但在这种情况下,Outlook无法将ics文件识别为正确的文件。
我们是否有可以同时在两个版本上使用的常规ics对象?
Outlook与UTC
时区可以正常工作。如果我们将日期和时间设置为UTC
时区,则Outlook会自动将此UTC
时间转换为用户对应的Timezone
。我们将必须为DTSTART:, DTEND:
和DTSTAMP
使用“即时”对象(可选,但建议使用)也。
快速测试只需在字符串中使用"DTSTART:"+Instant.now()
。
并且在Java 8中获取UTC
时间Java时间API通过巫师提供了Instant.now()
,您可以以UTC
格式获取系统时间。 Java 8还提供了类似的方法
[a.
Instant.ofEpochMilli()
-这将返回Instant,可以直接在ical Sting中使用。
[b.
new Date().toInstant()
返回UTC
即时对象。
在少数情况下,输入日期和时间源不同:
EST
,但是数据库中没有时区。因此,在从数据库中获取日期和时间值时,我在日期值中附加了时区,然后使用以下方法进一步转换为EPOC
时间public static long getEpocTimeWithTimezone(Date date) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter dateTimePattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(simpleDateFormat.format(date), dateTimePattern);
long epochInMilliSeconds = dateTime.atZone(ZoneId.of("America/New_York")).toEpochSecond() * 1000;
return epochInMilliSeconds;
}
然后将下面的代码用于ical字符串:
Instant startDt = Instant.ofEpochMilli(getEpocTimeWithTimezone(//pass your date here )).truncatedTo(ChronoUnit.MINUTES);
现在将此即时对象(startDt)直接设置为"DTSTART:"
:
"DTSTART:"+startDt+"....then in same fashion "DTEND:" also.
IST
,因此是假的对此要小心)因此,在这种情况下,只需假设myDateObject
是Date对象。因此,只需获取Instant
(通过使用myDateObject
类的toInstant()
,将来自Date
的UTC对象。
Instant startDt = myDateObject.toInstant().truncatedTo(ChronoUnit.MINUTES);
我正在使用.truncatedTo(ChronoUnit.MINUTES);
,因为如果我们不使用它,那么我们可能会在“会议邀请时间”部分获得额外的分钟或秒。因此,Outlook邮件的最终字符串应类似于:
. . . "BEGIN:VEVENT\n"+ "DTSTART:"+startDt+"\n"+ "DTEND:"+endDt+"\n"+ . . .
VVI Note:
因为Z
是UTC时区的表示,所以仅在时间的最后添加Z
不会是UTC
分区的时间,您将必须转换日期和时间,只有准确的时间才能进入Outlook。要验证您的时间是否为UTC格式,请仅将.ics附加文件(从电子邮件中获取)保存在本地,然后检查日期和时间是否为DTSTART:2020-05-15T13:57:00Z
。如果不是,则表示您未正确转换日期UTC
。