Termine verwalten: Erstellen & Bearbeiten, ICS in MSG konvertieren

Dieser Artikel behandelt kalendarbasierte iCalendar (ICS)-Termine, die über das Appointment Klasse. Um mit Outlook MapiCalendar Objekte stattdessen, siehe Verwalten von Outlook-Kalenderelementen; um Kalenderobjekte in einer PST zu speichern und zu lesen, siehe Verwalten von Kalenderelementen in PST‑Dateien.

Termin erstellen und auf Festplatte im MSG‑ oder ICS‑Format speichern

Die Appointment Klasse in Aspose.Email für .NET kann verwendet werden, um einen neuen Termin zu erstellen. In diesem Artikel erstellen wir zunächst einen Termin und speichern ihn im ICS-Format auf der Festplatte. Die folgenden Schritte sind erforderlich, um einen Termin zu erstellen und auf der Festplatte zu speichern.

  1. Erstellen Sie eine Instanz von dem Appointment Klasse und initialisieren Sie sie mit diesem Konstruktor.
  2. Geben Sie die folgenden Argumente im obigen Konstruktor an
    1. Ort
    2. Zusammenfassung
    3. Beschreibung
    4. Startdatum
    5. Endedatum
    6. Organisator
    7. Teilnehmer
  3. Rufen Sie die Save() Methode und geben Sie den Dateinamen sowie das Format in den Argumenten an.

Der Termin kann in Microsoft Outlook oder jedem anderen Programm, das eine ICS-Datei laden kann, geöffnet werden. Wird die Datei in Microsoft Outlook geöffnet, fügt sie den Termin automatisch dem Outlook-Kalender hinzu.

Das folgende Code‑Snippet zeigt, wie Sie einen Termin auf der Festplatte im ICS‑ oder MSG‑Format erstellen und speichern.


// Create and initialize an instance of the Appointment class
Appointment appointment = new Appointment(
    "Meeting Room 3 at Office Headquarters",// Location
    "Monthly Meeting",                      // Summary
    "Please confirm your availability.",    // Description
    new DateTime(2015, 2, 8, 13, 0, 0),     // Start date
    new DateTime(2015, 2, 8, 14, 0, 0),     // End date
    "from@domain.com",                      // Organizer
    "attendees@domain.com");                // Attendees

// Save the appointment to disk in ICS format            
appointment.Save(fileName + ".ics", new AppointmentIcsSaveOptions());
Console.WriteLine("Appointment created and saved to disk successfully.");

// Save the appointment to disk in MSG format
appointment.Save(fileName + ".msg", new AppointmentMsgSaveOptions());
Console.WriteLine("Appointment created and saved to disk successfully.");

Einen Termin mit HTML-Inhalt erstellen

Sie können alternative Darstellungen der Ereignisbeschreibung in verschiedenen Inhaltstypen mittels des X-ALT-DESC‑Headers angeben. Dies ermöglicht Empfängern der iCalendar‑Datei, die Darstellung zu wählen, die ihren Bedürfnissen am besten entspricht. Beispielsweise können Sie eine reine Textbeschreibung mit dem Inhaltstyp "text/plain" und eine HTML‑Beschreibung mit dem Inhaltstyp "text/html" einschließen. Für jede alternative Darstellung wird ein X-ALT-DESC‑Header hinzugefügt. Um einen Termin mit HTML‑Inhalt zu erstellen, setzen Sie die HtmlDescription Eigenschaft.

Probieren Sie das folgende Codebeispiel, um einen Termin mit alternativer HTML‑Beschreibung zu erstellen:

  1. Erstellen Sie eine neue Instanz der Appointment‑Klasse.
  2. Geben Sie die erforderlichen Parameter für den Appointment‑Konstruktor an:
    • Geben Sie den Ort des Termins an.
    • Setzen Sie das Startdatum und die -zeit.
    • Setzen Sie das Enddatum und die -zeit.
    • Geben Sie den Organisator an.
    • Geben Sie den Teilnehmer an.
  3. Setzen Sie die HtmlDescription Eigenschaft des Terminobjekts, die angibt, dass die Beschreibung im HTML‑Format vorliegt.
  4. Setzen Sie die Description‑Eigenschaft des Terminobjekts auf einen HTML‑formatierten String, eingeschlossen in einem mehrzeiligen String:
    • Das HTML‑Markup enthält einen <style>-Block, der eine CSS‑Klasse namens "text" mit Schriftstil‑Definitionen definiert.
    • Der HTML‑Body enthält ein Absatz‑Tag <p> mit der CSS‑Klasse "text" sowie die eigentliche Einladung.
  5. Das Terminobjekt ist jetzt fertig, und Sie können weitere Vorgänge ausführen oder es als iCalendar‑Datei speichern.
var appointment = new Appointment("Bygget 83",
    DateTime.UtcNow, // start date
    DateTime.UtcNow.AddHours(1), // end date
    new MailAddress("TintinStrom@from.com", "Tintin Strom"), // organizer
    new MailAddress("AinaMartensson@to.com", "Aina Martensson")) // attendee
{
    HtmlDescription = @"
    <html>
     <style type=""text/css"">
      .text {
             font-family:'Comic Sans MS';
             font-size:16px;
            }
     </style>
    <body>
     <p class=""text"">Hi, I'm happy to invite you to our party.</p>
    </body>
    </html>"
};

Entwurf einer Terminanfrage erstellen

In unseren vorherigen Artikeln wurde gezeigt, wie man einen Termin im ICS‑Format erstellt und speichert. Oft ist es erforderlich, eine Termin‑anfrage im Entwurfsmodus zu erstellen, sodass die Grundinformationen hinzugefügt werden und der Entwurf anschließend an andere Benutzer weitergeleitet werden kann, um notwendige Änderungen vorzunehmen. Um einen Termin im Entwurfsmodus zu speichern, muss die MethodType Eigenschaft der Appointment‑Klasse sollte auf AppointmentMethodType.Publish. Das folgende Code‑Snippet zeigt, wie Sie eine Terminanforderung im Entwurf erstellen.

string sender = "test@gmail.com";
string recipient = "test@email.com";

MailMessage message = new MailMessage(sender, recipient, string.Empty, string.Empty);

Appointment app = new Appointment(string.Empty, DateTime.Now, DateTime.Now, sender, recipient)
{
    MethodType = AppointmentMethodType.Publish
};

message.AddAlternateView(app.RequestApointment());

MapiMessage msg = MapiMessage.FromMailMessage(message);

// Save the appointment as draft.
msg.Save(dstDraft);

Console.WriteLine(Environment.NewLine + "Draft saved at " + dstDraft);

Entwurf einer Terminerstellung aus Text

Das folgende Codebeispiel zeigt, wie man einen Entwurfstermin aus Text erstellt. 

string ical = @"BEGIN:VCALENDAR
METHOD:PUBLISH
PRODID:-//Aspose Ltd//iCalender Builder (v3.0)//EN
VERSION:2.0
BEGIN:VEVENT
ATTENDEE;CN=test@gmail.com:mailto:test@gmail.com
DTSTART:20130220T171439
DTEND:20130220T174439
DTSTAMP:20130220T161439Z
END:VEVENT
END:VCALENDAR";

string sender = "test@gmail.com";
string recipient = "test@email.com";
MailMessage message = new MailMessage(sender, recipient, string.Empty, string.Empty);
AlternateView av = AlternateView.CreateAlternateViewFromString(ical, new ContentType("text/calendar"));
message.AlternateViews.Add(av);
MapiMessage msg = MapiMessage.FromMailMessage(message);
msg.Save(dataDir + "draft_out.msg");

Termine anpassen

Status der Termin-Teilnehmer festlegen

Die Aspose.Email für .NET‑API lässt Sie den Status von Termin‑Teilnehmern festlegen, während Sie eine Antwortnachricht formulieren. Dies fügt die PARTSTAT‑Eigenschaft zur ICS‑Datei hinzu.

DateTime startDate = new DateTime(2011, 12, 10, 10, 12, 11),
         endDate = new DateTime(2012, 11, 13, 13, 11, 12);
MailAddress organizer = new MailAddress("aaa@amail.com", "Organizer");
MailAddressCollection attendees = new MailAddressCollection();
MailAddress attendee1 = new MailAddress("bbb@bmail.com", "First attendee");
MailAddress attendee2 = new MailAddress("ccc@cmail.com", "Second attendee");

attendee1.ParticipationStatus = ParticipationStatus.Accepted;
attendee2.ParticipationStatus = ParticipationStatus.Declined;
attendees.Add(attendee1);
attendees.Add(attendee2);

Appointment target = new Appointment(location, startDate, endDate, organizer, attendees);

Produktkennung für iCalendar anpassen

Die Aspose.Email für .NET‑API ermöglicht das Abrufen oder Festlegen der Produktkennung, die das iCalendar‑Objekt erstellt hat.

string description = "Test Description";
Appointment app = new Appointment("location", "test appointment", description, DateTime.Today,
DateTime.Today.AddDays(1), "first@test.com", "second@test.com");

AppointmentIcsSaveOptions saveOptions = AppointmentIcsSaveOptions.Default;
saveOptions.ProductId = "Test Corporation";
app.Save(dataDir + "ChangeProdIdOfICS.ics", saveOptions);

Termine laden

Außerdem, die Appointment Klasse kann verwendet werden, um einen Termin aus einer ICS‑Datei zu laden.

Termin im ICS-Format laden

Um einen Termin im ICS-Format zu laden, sind die folgenden Schritte erforderlich:

  1. Erstellen Sie eine Instanz von dem Appointment Klasse.
  2. Rufen Sie die Load() Methode, indem Sie den Pfad der ICS‑Datei angeben.
  3. Lesen Sie beliebige Eigenschaften, um Informationen aus dem Termin (ICS‑Datei) zu erhalten.

Das folgende Code‑Snippet zeigt, wie Sie einen Termin im ICS‑Format laden.

// Load an Appointment just created and saved to disk and display its details.
Appointment loadedAppointment = Appointment.Load(dstEmail);
Console.WriteLine(Environment.NewLine + "Loaded Appointment details are as follows:");
// Display the appointment information on screen
Console.WriteLine("Summary: " + loadedAppointment.Summary);
Console.WriteLine("Location: " + loadedAppointment.Location);
Console.WriteLine("Description: " + loadedAppointment.Description);
Console.WriteLine("Start date: " + loadedAppointment.StartDate);
Console.WriteLine("End date: " + loadedAppointment.EndDate);
Console.WriteLine("Organizer: " + loadedAppointment.Organizer);
Console.WriteLine("Attendees: " + loadedAppointment.Attendees);
Console.WriteLine(Environment.NewLine + "Appointment loaded successfully from " + dstEmail);

ICS in MSG konvertieren

Die API ermöglicht es Ihnen, einen Termin einfach in ein Nachrichtenobjekt zu konvertieren. Das folgende Codebeispiel zeigt, wie Sie eine Terminanforderung in ein MailMessage‑ oder MapiMessage‑Objekt umwandeln:

var appointment = Appointment.Load("appRequest.ics");

var eml = appointment.ToMailMessage();
var msg = appointment.ToMapiMessage();

Mehrere Ereignisse aus einer ICS-Datei lesen

List<Appointment> appointments = new List<Appointment>();
CalendarReader reader = new CalendarReader(dataDir + "US-Holidays.ics");

while (reader.NextEvent())
{
    appointments.Add(reader.Current);
}
//working with appointments...

Mehrere Ereignisse in eine ICS‑Datei schreiben

AppointmentIcsSaveOptions saveOptions = new AppointmentIcsSaveOptions();
saveOptions.Action = AppointmentAction.Create;
using (CalendarWriter writer = new CalendarWriter(dataDir + "WriteMultipleEventsToICS_out.ics", saveOptions))
{
    for (int i = 0; i < 10; i++)
    {
        Appointment app = new Appointment(string.Empty, DateTime.Now, DateTime.Now, "sender@domain.com", "receiver@domain.com");
        app.Description = "Test body " + i;
        app.Summary = "Test summary:" + i;
        writer.Write(app);
    }
}

Bestimmen der Terminversion

Um die Version eines Termins zu bestimmen, können Sie die Appointment.Version Eigenschaft des Appointment Klasse. Diese Eigenschaft hilft dabei zu bestimmen, auf welcher Version die Dateien basieren, um die Integration mit anderen Systemen und Apps sicherzustellen.

Das folgende Codebeispiel zeigt, wie Sie diese Eigenschaft in Ihrem Projekt implementieren:

var app = Appointment.Load("meeting.ics");

// Version is a string that holds the ICS/VCS version, e.g. "2.0" for iCalendar
if (app.Version == "2.0")
{
    // do something
}

Senden und Absagen von Meeting‑Anfragen

Die Appointment Klasse hinzugefügt, zusammen mit dem SmtpClient, kann verwendet werden, um Meeting‑Anfragen, wiederkehrende Meeting‑Anfragen, Updates und Absagen per E‑Mail zu senden. Der Termin wird zu einer MailMessage als alternative Ansicht.

Eine Meeting‑Anfrage senden

Um eine Meeting‑Anfrage zu senden, erstellen Sie eine Appointment, fügen Sie sie einer Nachricht mit dem RequestApointment Methode und senden Sie die Nachricht. Speichern Sie die UniqueId Wert, damit Sie später beim Senden eines Updates oder einer Absage dieselbe Terminreferenz verwenden können.

// Create an instance of SmtpClient
SmtpClient client = new SmtpClient("smtp.gmail.com", 587, "user@gmail.com", "password");
client.SecurityOptions = SecurityOptions.Auto;

// Gather the attendees
MailAddressCollection attendees = new MailAddressCollection();
attendees.Add(new MailAddress("first.attendee@domain.com", "First Attendee"));
attendees.Add(new MailAddress("second.attendee@domain.com", "Second Attendee"));

// Create the message and the appointment
MailMessage msg = new MailMessage();
msg.From = "organizer@domain.com";
msg.To = attendees;

Appointment app = new Appointment("Meeting Room 1", DateTime.Now, DateTime.Now.AddHours(1), msg.From, attendees);
app.Summary = "Monthly Meeting";
app.Description = "Please confirm your availability.";

// Add the appointment to the message and send it
msg.AddAlternateView(app.RequestApointment());
client.Send(msg);

Eine wiederkehrende Meeting‑Anfrage senden

Um eine Meeting‑Anfrage mit Wiederholung zu erstellen, weisen Sie ein Wiederholungsmuster zu (z. B. ein WeeklyRecurrencePattern) an die Appointment.Recurrence Eigenschaft. Das Speichern der eindeutigen Termin‑ID ermöglicht es, später Updates zum Termin zu senden.

// Create a mail message
MailMessage msg1 = new MailMessage();
msg1.To.Add("to@domain.com");
msg1.From = new MailAddress("from@gmail.com");

// Fill the appointment object
DateTime startDate = new DateTime(2013, 12, 1, 17, 0, 0);
DateTime endDate = new DateTime(2013, 12, 31, 17, 30, 0);
Appointment agendaAppointment = new Appointment("same place", startDate, endDate, msg1.From, msg1.To);

// Create a unique id so the appointment can be accessed later
string szUniqueId = Guid.NewGuid().ToString();
agendaAppointment.UniqueId = szUniqueId;
agendaAppointment.Description = "----------------";

// Create a weekly recurrence pattern: Mon, Tue and Thu
WeeklyRecurrencePattern pattern1 = new WeeklyRecurrencePattern(14);
pattern1.StartDays = new CalendarDay[3];
pattern1.StartDays[0] = CalendarDay.Monday;
pattern1.StartDays[1] = CalendarDay.Tuesday;
pattern1.StartDays[2] = CalendarDay.Thursday;
pattern1.Interval = 1;

// Set the recurrence pattern for the appointment
agendaAppointment.Recurrence = pattern1;

// Attach the appointment to the mail
msg1.AlternateViews.Add(agendaAppointment.RequestApointment());

// Send the mail with the appointment request
SmtpClient client = new SmtpClient("smtp.gmail.com", 587, "your.email@gmail.com", "your.password");
client.SecurityOptions = SecurityOptions.Auto;
client.Send(msg1);

Eine Termin‑Update‑Anfrage senden

Um ein Update für einen bereits gesendeten Termin zu senden, ist die eindeutige ID des Termins erforderlich. Verwenden Sie das UpdateAppointment Methode, um die alternative Ansicht für das Update zu erstellen.

static public void SendUpdate(string szUniqueId)
{
    DateTime startDate = new DateTime(2013, 12, 12, 17, 0, 0);
    DateTime endDate = new DateTime(2013, 12, 12, 17, 30, 0);
    Appointment appUpdate = new Appointment("Different Place", startDate, endDate,
        "organizer@gmail.com", "attendee@domain.com");
    appUpdate.UniqueId = szUniqueId;
    appUpdate.Summary = "update meeting request summary";
    appUpdate.Description = "update";

    MailMessage msgUpdate = new MailMessage("organizer@gmail.com", "attendee@domain.com",
        "test email - update meeting request", "test email");
    msgUpdate.AddAlternateView(appUpdate.UpdateAppointment());

    SmtpClient smtp = new SmtpClient("server.domain.com", 587, "username", "password");
    smtp.Send(msgUpdate);
}

Ein Meeting‑Anfrage absagen

Um ein Meeting abzusagen, erstellen Sie dasselbe Appointment (unter Verwendung der Informationen, die Sie beim Senden der Anfrage gespeichert haben), fügen Sie sie einer Nachricht mit dem CancelAppointment Methode und senden Sie die Nachricht an die Teilnehmer.

// Re-create the attendee collection and the appointment from your stored data
MailAddressCollection attendees = new MailAddressCollection();
attendees.Add(new MailAddress("first.attendee@domain.com", "First Attendee"));
attendees.Add(new MailAddress("second.attendee@domain.com", "Second Attendee"));

Appointment app = new Appointment("Meeting Room 1", "Monthly Meeting", "Please confirm your availability.",
    DateTime.Now, DateTime.Now.AddHours(1),
    new MailAddress("organizer@domain.com", "Organizer"), attendees);

// Create the cancellation message
MailMessage msg = new MailMessage();
msg.From = new MailAddress("organizer@domain.com", "");
msg.To = attendees;
msg.Subject = "Cancel meeting";
msg.AddAlternateView(app.CancelAppointment());

SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587, "user@gmail.com", "password");
smtp.Send(msg);

Arbeiten mit iCalendar‑Wiederholungsmustern

Ein Wiederholungsmuster ist eine Möglichkeit, einen bestimmten Zeitplan zu beschreiben. Es enthält gerade genug Informationen, um eine Liste von Vorkommen (Datum und Uhrzeit) gemäß einem gegebenen Zeitplan zu erstellen. Ein Wiederholungsmuster kann Wiederholungsregeln enthalten, die Zyklen beschreiben, die zusammen den Gesamtablauf bilden. Im Allgemeinen gilt: Je komplexer ein Wiederholungsmuster ist, desto mehr Wiederholungsregeln wird es enthalten.

Wiederholungsmuster können Ausnahmen enthalten (nicht zu verwechseln mit Ausnahmen, die Fehler während der Programmausführung darstellen). Ausnahmen fügen Vorkommensdaten hinzu oder entfernen sie relativ zum ursprünglichen Muster. Sie können als explizite Vorkommen oder selbst als Muster angegeben werden. Beispiele für Wiederholungsmuster mit Ausnahmen:

  • Jeden 2. Freitag, außer von Juni bis August.
  • Der 1. jedes Monats, außer im Januar, wo er am 2. sein sollte.

Der iCalendar‑RFC definiert Komponenten, wie VEVENT oder VTODO, die Ereignisse oder Aufgaben darstellen. Die Komponenten können Eigenschaften wie Start‑Datum/Uhrzeit, Beschreibung, Ort, Teilnehmer und Wiederholung besitzen. Ein Wiederholungsmuster ist normalerweise eine Eigenschaft einer wiederkehrenden Aufgabe oder eines Ereignisses. Die vom iCalendar definierten Wiederholungseigenschaften sind:

  • DTSTART – das Start‑Datum und die Start‑Uhrzeit des Musters (repräsentiert auch das erste Vorkommen, falls nicht explizit ausgeschlossen).
  • RRULE – definiert eine wiederholende Regel für ein Wiederholungs‑Set.
  • RDATE – definiert eine Liste von Datum‑ und Zeitwerten, die in ein Wiederholungs‑Set aufgenommen werden sollen.
  • EXRULE – gibt eine wiederholende Regel für Ausnahmen aus einem Wiederholungs‑Set an.
  • EXDATE – definiert eine Liste von Datum‑ und Zeit‑Ausnahmen aus einem Wiederholungs‑Set.

Nur DTSTART ist erforderlich, und es darf nur ein DTSTART geben. Alle anderen Eigenschaften sind optional und können mehrmals angegeben werden.

Das Aspose.Email Wiederholungs‑Objektmodell

Die Aspose.Email.Calendar.Recurrences Namespace enthält die Klassen zum Arbeiten mit iCalendar‑Wiederholungen. CalendarRecurrence und RecurrenceRule sind die zentralen Klassen und bieten konkrete Implementierungen der entsprechenden RFC‑2445‑Elemente.

  • Die CalendarRecurrence Klasse repräsentiert das gesamte Wiederholungsmuster. Sie können ein neues Wiederholungsmuster von Grund auf mit dem Standardkonstruktor erstellen oder ein bestehendes Muster im iCalendar‑Format mit dem statischen FromiCalendar Methode.
  • Die RecurrenceRule Klasse repräsentiert den RRULE‑ oder EXRULE‑Teil eines Wiederholungsmusters. RecurrenceRule exponiert eine Reihe von Eigenschaften, die direkt auf ihre Gegenstücke im iCalendar‑Standard abgebildet werden. Beispielweise, ByMonth mappt zu BYMONTH in iCalendar usw. Durch das Untersuchen oder Setzen von Werten der RecurrenceRule Eigenschaften können Sie ein Wiederholungsregel analysieren oder ändern.

Der folgende Codeausschnitt lädt ein Wiederholungsmuster (bei dem der RRULE‑Teil die Wiederholungsregel enthält) und erzeugt die Vorkommen:

// Ten team meetings, every Monday at 10am.
CalendarRecurrence pattern = new CalendarRecurrence("DTSTART:20040301T100000\n" + "RRULE:FREQ=WEEKLY;COUNT=10;BYDAY=MO");
DateCollection dates = pattern.GenerateOccurrences();

Vorkommen aus einem Wiederholungsmuster erzeugen

Mit Aspose.Email ist es möglich, Vorkommen aus einem Wiederholungsmuster zu erzeugen. Um das „nächste“ Vorkommen zu erhalten, verwenden Sie die GenerateOccurrences Methode mit dem Parameter nNextOccurrences = 1. Der folgende Codeausschnitt erzeugt 20 Vorkommen mittels GenerateOccurrences(20).

CalendarRecurrence recurrencePattern = new CalendarRecurrence();
recurrencePattern.StartDate = new DateTime(1997, 9, 10, 9, 0, 0);
RecurrenceRule rule = recurrencePattern.RRules.Add();
rule.Frequency = Frequency.Monthly;
rule.Count = 20;
rule.Interval = 18;
rule.ByMonthDay.Add(new int[] { 10, 11, 12, 13, 14, 15 });
DateCollection expectedDates = recurrencePattern.GenerateOccurrences(20);
Console.WriteLine("expectedDates.Count = " + expectedDates.Count);
foreach (DateTime date in expectedDates)
{
    Console.WriteLine("DateTime = " + date);
}

Benutzerfreundlichen Text für ein Wiederholungsmuster erhalten

Benutzerfreundlicher Text für eine Regel kann mit dem FriendlyText Eigenschaft. Die Ausgabe des folgenden Codes ist: "Wiederhole jeden Monat am 1. und am 1. vom Ende des Monats für maximal 2 Vorkommen."

RecurrenceRule rule = new RecurrenceRule();
rule.Frequency = Frequency.Monthly;
rule.Count = 2;
rule.ByMonthDay.Add(1);
rule.ByMonthDay.Add(-1);
Console.WriteLine(rule.FriendlyText);

Beispiel‑Wiederholungsmuster

Die folgenden Beispiel‑RRULE‑Strings zeigen, wie man gängige Zeitpläne ausdrückt.

  • Den letzten Tag des Monats, jeden Monat. Wenn Sie ein Vorkommen am Tag vor dem letzten Tag des Monats wünschen, verwenden Sie BYMONTHDAY=-2. Wenn Sie BYMONTHDAY=31, dann wird laut iCalendar‑Standard in Monaten mit weniger als 31 Tagen kein Vorkommen erzeugt.

    RRULE:FREQ=MONTHLY;BYMONTHDAY=-1
    
  • Der letzte Werktag jedes Monats. Diese Regel gibt alle Werktage eines Monats an und wählt den letzten aus. Das Ergebnis ist der letzte Arbeitstag im Monat.

    RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
    
  • Der letzte Montag des Jahres.

    RRULE:FREQ=YEARLY;BYDAY=-1MO
    
  • Freitag der ersten ISO 8601‑Woche des Jahres. In der ISO 8601‑Spezifikation ist die erste Woche des Jahres die erste Woche mit mindestens vier Tagen.

    FREQ=YEARLY;BYWEEKNO=1;BYDAY=FR
    
  • Erster Freitag des Jahres. 1999 war zum Beispiel der 1. Freitag des Jahres der 01.01.1999, während der Freitag der 1. ISO‑8601‑Woche der 08.01.1999 war.

    FREQ=YEARLY;BYDAY=1FR
    

Wichtige iCalendar‑Details (RFC 2445)

Daten oder Daten mit zugehörigen Zeiten können in den Elementen DTSTART, UNTIL, EXDATE und RDATE verwendet werden, wenn ein Wiederholungsmuster angegeben wird. iCalendar definiert den DATE‑Wertetyp zur Identifizierung von Werten, die ein Kalenderdatum enthalten, und den DATE‑TIME‑Typ zur Identifizierung von Werten, die ein genaues Kalenderdatum und eine Tageszeit angeben. DATE‑TIME‑Werte können in drei Formen angegeben werden: lokale Zeit, UTC‑Zeit und lokale Zeit mit Zeitzone.

  • DATE. Laut iCalendar‑Standard müssen DATE‑Werte dem yyyyMMdd Format. Beispielweise, 19970714 stellt den 14. Juli 1997 dar.
  • DATE‑TIME mit lokaler Zeit. Das Datum‑mit‑lokaler‑Zeit‑Format ist einfach ein Datums‑Zeit‑Wert, der keinen UTC‑Bezeichner enthält und keine Zeitzone referenziert. Beispielweise, DTSTART:19980118T230000 stellt den 18. Januar 1998 um 23 Uhr dar. Datums‑Zeit‑Werte dieses Typs gelten als „floating“ und sind keiner bestimmten Zeitzone zugeordnet. Sie repräsentieren dieselbe Stunde, Minute und Sekunde unabhängig von der jeweils beobachteten Zeitzone.
  • DATE‑TIME mit UTC‑Zeit. Das Datum mit UTC‑Zeit (absolute Zeit) wird durch einen Großbuchstaben gekennzeichnet Z suffix an den Zeitwert anhängt. Beispielweise, DTSTART:19980119T070000Z stellt den 19. Januar 1998 um 07:00 UTC dar. Beachten Sie, dass Aspose.Email das UTC‑ Z suffix und behandelt die Zeit als lokale Zeit. Der RFC 2445‑Standard besagt, dass ein im UNTIL‑Teil eines Wiederholungsmusters angegebener Zeitanteil im UTC‑Format sein muss; Aspose.Email akzeptiert die Zeit in beliebigem Format im UNTIL‑Teil.
  • DATE‑TIME mit lokaler Zeit und Zeitzone. Um eine Zeitzone zu referenzieren, wird DATE‑TIME mit der TZID‑Eigenschaft modifiziert. Beispielweise, DTSTART;TZID=US-Eastern:19980119T020000 stellt 2 Uhr morgens in New York am 19. Januar 1998 dar. Beachten Sie, dass Aspose.Email derzeit den TZID‑Parameter ignoriert und die Zeit als lokale Zeit behandelt.
  • BYWEEKNO und ISO 8601‑Konformität. BYWEEKNO nur verwenden, wenn die Konformität mit ISO 8601 ist erforderlich. Wochenzahlen gemäß ISO 8601 unterscheiden sich von üblichen Wochenzahlen: Woche 1 des Kalenderjahres ist die erste Woche, die mindestens vier Tage enthält. Die BYWEEKNO‑Regel gibt eine kommagetrennte Liste von Zahlen an, die Wochen des Jahres identifizieren (gültige Werte sind 1‑53 und -1‑‑53) und ist nur für JÄHRLICHE Regeln gültig.

Siehe auch