会议请求时间与完整的VS lite Outlook版本不匹配

问题描述 投票:1回答:1

我正在使用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对象?

java outlook icalendar outlook-web-app
1个回答
0
投票
我有同样的问题,为此我很努力。因此,以下是我的发现:

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即时对象。

在少数情况下,输入日期和时间源不同:

  1. 如果您要从数据库中获取日期和时间,则在这种情况下,数据库未将其唯一保存的日期和时间存储在时区中。因此,首先在保存在数据库中的那个时区中转换日期和时间,在我的情况下,我是在“ EST”时区中转换后存储日期和时间,而日期值是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.

  2. 在第二种情况下,您具有带时区的日期(请确保在转换后您不会丢失您的实际时区,就像在将数据库中的日期保存后的第一种情况中,我们实际上丢失了时区,但是它显示的是时区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
© www.soinside.com 2019 - 2024. All rights reserved.