Zarządzanie spotkaniami: tworzenie i modyfikacja, konwersja z ICS do MSG

Ten artykuł opisuje spotkania iCalendar (ICS) oparte na standardach, obsługiwane przez Appointment klasa. Aby pracować z Outlook MapiCalendar elementy zamiast tego, zobacz Zarządzanie elementami kalendarza Outlook; aby przechowywać i odczytywać elementy kalendarza wewnątrz pliku PST, zobacz Zarządzanie elementami kalendarza w plikach PST.

Utwórz spotkanie i zapisz na dysku w formacie MSG lub ICS

Ten Appointment klasa w Aspose.Email for .NET może być użyta do utworzenia nowego spotkania. W tym artykule najpierw tworzymy spotkanie i zapisujemy je na dysku w formacie ICS. Aby utworzyć spotkanie i zapisać je na dysku, wymagane są następujące kroki.

  1. Utwórz instancję Appointment klasę i zainicjalizuj ją przy użyciu tego konstruktora.
  2. Przekaż następujące argumenty do powyższego konstruktora
    1. Lokalizacja
    2. Podsumowanie
    3. Opis
    4. Data rozpoczęcia
    5. Data zakończenia
    6. Organizator
    7. Uczestnicy
  3. Wywołaj Save() metodę i określić nazwę pliku oraz format w argumentach.

Spotkanie może być otwarte w Microsoft Outlook lub w dowolnym programie, który potrafi wczytać plik ICS. Jeśli plik zostanie otwarty w Microsoft Outlook, automatycznie dodaje spotkanie do kalendarza Outlook.

Poniższy fragment kodu pokazuje, jak utworzyć i zapisać spotkanie na dysku w formacie ICS lub MSG.


// 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.");

Utwórz spotkanie z zawartością HTML

Możesz określić alternatywne reprezentacje opisu wydarzenia w różnych typach treści przy użyciu nagłówka X-ALT-DESC. Umożliwia to odbiorcom pliku iCalendar wybranie reprezentacji najlepiej spełniającej ich potrzeby. Na przykład możesz dołączyć opis w formacie tekstowym przy użyciu typu "text/plain" oraz opis w HTML przy użyciu typu "text/html". Dla każdej alternatywnej reprezentacji dodawany jest nagłówek X-ALT-DESC. Aby utworzyć spotkanie z treścią HTML, ustaw HtmlDescription właściwość.

Wypróbuj poniższy przykład kodu, aby utworzyć spotkanie z alternatywnym opisem w HTML:

  1. Utwórz nową instancję klasy Appointment.
  2. Podaj niezbędne parametry do konstruktora Appointment:
    • Określ miejsce spotkania.
    • Ustaw datę i godzinę rozpoczęcia.
    • Ustaw datę i godzinę zakończenia.
    • Określ organizatora.
    • Określ uczestnika.
  3. Ustaw HtmlDescription właściwość obiektu spotkania wskazująca, że opis jest w formacie HTML.
  4. Ustaw właściwość Description obiektu spotkania na ciąg sformatowany w HTML, zamknięty w wieloliniowym ciągu znaków:
    • Znacznik HTML zawiera blok <style> definiujący klasę CSS o nazwie "text" ze stylami czcionki.
    • Ciało HTML zawiera znacznik paragrafu <p> z klasą CSS "text" oraz faktyczną treść zaproszenia.
  5. Obiekt spotkania jest teraz gotowy; możesz wykonać dalsze operacje lub zapisać go jako plik iCalendar.
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>"
};

Utwórz wniosek o wersję roboczą spotkania

W naszych wcześniejszych artykułach pokazaliśmy, jak tworzyć i zapisywać spotkanie w formacie ICS. Często wymaga się utworzenia żądania spotkania w trybie szkicu, aby podstawowe informacje zostały dodane, a następnie szkic został przekazany innym użytkownikom w celu wprowadzenia niezbędnych zmian. Aby zapisać spotkanie w trybie szkicu, MethodType właściwość klasy Appointment powinna być ustawiona na AppointmentMethodType.Publish. Poniższy fragment kodu pokazuje, jak utworzyć wstępne żądanie spotkania.

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);

Tworzenie wersji roboczej spotkania z tekstu

Poniższy fragment kodu pokazuje, jak utworzyć wersję roboczą spotkania z tekstu. 

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");

Dostosowywanie spotkań

Ustaw status uczestników spotkania

API Aspose.Email dla .NET pozwala ustawić status uczestników spotkania podczas tworzenia wiadomości odpowiedzi. Dodaje to właściwość PARTSTAT do pliku ICS.

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);

Dostosuj identyfikator produktu dla iCalendar

API Aspose.Email dla .NET umożliwia pobranie lub ustawienie identyfikatora produktu, które utworzyło obiekt iCalendar.

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);

Ładowanie spotkań

Ponadto, Appointment klasa może być użyta do wczytania spotkania z pliku ICS.

Załaduj spotkanie w formacie ICS

Aby załadować spotkanie w formacie ICS, wymagane są następujące kroki:

  1. Utwórz instancję Appointment klasa.
  2. Wywołaj Load() metoda poprzez podanie ścieżki do pliku ICS.
  3. Odczytaj dowolną właściwość, aby uzyskać dowolną informację ze spotkania (plik ICS).

Poniższy fragment kodu pokazuje, jak załadować spotkanie w formacie ICS.

// 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);

Konwertuj ICS do MSG

API umożliwia łatwą konwersję spotkania do obiektu wiadomości. Poniższy przykład kodu pokazuje, jak przekształcić żądanie spotkania w MailMessage lub MapiMessage:

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

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

Odczyt wielu zdarzeń z pliku ICS

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

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

Zapis wielu zdarzeń do pliku ICS

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);
    }
}

Określ wersję spotkania

Aby określić wersję spotkania, możesz użyć Appointment.Version właściwość Appointment klasa. Ta właściwość pomaga określić, na której wersji opierają się ich pliki, zapewniając integrację z innymi systemami i aplikacjami.

Poniższy przykład kodu pokazuje, jak zaimplementować tę właściwość w projekcie:

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
}

Wysyłanie i odwoływanie żądań spotkań

Ten Appointment klasy, razem z SmtpClient, może być użyte do wysyłania żądań spotkań, żądań spotkań cyklicznych, aktualizacji i odwołań e‑mailem. Spotkanie jest dodawane do MailMessage jako alternatywny widok.

Wyślij żądanie spotkania

Aby wysłać żądanie spotkania, utwórz Appointment, dodaj ją do wiadomości przy użyciu RequestApointment metodę i wyślij wiadomość. Zapisz identyfikator spotkania UniqueId wartość, aby móc odwołać się do tego samego spotkania później przy wysyłaniu aktualizacji lub odwołania.

// 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);

Wyślij żądanie spotkania z powtarzalnością

Aby utworzyć żądanie spotkania z powtarzalnością, przypisz wzorzec powtarzalności (na przykład WeeklyRecurrencePattern) do Appointment.Recurrence właściwość. Zapisanie unikalnego identyfikatora spotkania umożliwia późniejsze wysyłanie aktualizacji.

// 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);

Wyślij żądanie aktualizacji spotkania

Aby wysłać aktualizację wcześniej wysłanego spotkania, wymagany jest unikalny identyfikator spotkania. Użyj UpdateAppointment metodę, aby zbudować alternatywny widok aktualizacji.

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);
}

Odwołaj żądanie spotkania

Aby odwołać spotkanie, zbuduj taki sam Appointment (korzystając z informacji zapisanej przy wysyłaniu żądania), dodaj ją do wiadomości za pomocą CancelAppointment metodę i wyślij wiadomość do uczestników.

// 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);

Praca z wzorcami powtarzalności iCalendar

Wzorzec powtarzalności to sposób opisania konkretnego harmonogramu. Zawiera on wystarczającą ilość informacji, aby utworzyć listę wystąpień (dat i godzin) zgodnie z podanym harmonogramem. Wzorzec powtarzalności może zawierać reguły powtarzalności opisujące cykle łączące się w ogólny wzorzec. Generalnie, im bardziej złożony wzorzec, tym więcej reguł powtarzalności będzie zawierał.

Wzorce powtarzalności mogą zawierać wyjątki (nie mylić z wyjątkami oznaczającymi błędy podczas wykonywania aplikacji). Wyjątki dodają lub usuwają daty wystąpień względem pierwotnego wzorca. Mogą być określone jako jawne wystąpienia lub jako samodzielny wzorzec. Przykłady wzorców powtarzalności z wyjątkami:

  • Co drugi piątek, z wyjątkiem od czerwca do sierpnia.
  • Pierwszy dzień każdego miesiąca, z wyjątkiem stycznia, kiedy powinien być 2.

Standard iCalendar RFC definiuje komponenty, takie jak VEVENT czy VTODO, które reprezentują zdarzenia lub zadania. Komponenty mogą mieć właściwości takie jak data/godzina rozpoczęcia, opis, lokalizacja, uczestnicy i powtarzalność. Wzorzec powtarzalności zwykle istnieje jako właściwość powtarzalnego zadania lub wydarzenia. Właściwości wzorca powtarzalności określone w iCalendar to:

  • DTSTART – data i godzina rozpoczęcia wzorca (również reprezentuje pierwsze wystąpienie, jeśli nie zostanie wykluczone explicite).
  • RRULE – określa regułę powtarzania dla zestawu powtarzalności.
  • RDATE – definiuje listę dat i godzin do uwzględnienia w zestawie powtarzalności.
  • EXRULE – określa regułę powtarzania dla wyjątków z zestawu powtarzalności.
  • EXDATE – definiuje listę wyjątków dat i godzin z zestawu powtarzalności.

Jedynie DTSTART jest wymagany i musi występować tylko raz. Wszystkie pozostałe właściwości są opcjonalne i mogą być podawane wielokrotnie.

Model obiektowy powtarzalności Aspose.Email

Ten Aspose.Email.Calendar.Recurrences przestrzeń nazw zawiera klasy używane do pracy z powtarzalnościami iCalendar. CalendarRecurrence i RecurrenceRule są centralnymi klasami i zapewniają konkretne implementacje odpowiadających elementów RFC 2445.

  • Ten CalendarRecurrence klasa reprezentuje cały wzorzec powtarzalności. Możesz utworzyć nowy wzorzec od podstaw, używając domyślnego konstruktora, lub wczytać istniejący wzorzec w formacie iCalendar przy pomocy statycznego FromiCalendar metoda.
  • Ten RecurrenceRule klasa reprezentuje część RRULE lub EXRULE wzorca powtarzania. RecurrenceRule ujawnia szereg właściwości, które bezpośrednio mapują się na ich odpowiedniki w standardzie iCalendar. Na przykład, ByMonth odwzorowuje BYMONTH w iCalendar i tak dalej. Analizując lub ustawiając wartości RecurrenceRule właściwości, możesz analizować lub modyfikować regułę powtarzalności.

Poniższy fragment kodu wczytuje wzorzec powtarzalności (gdzie część RRULE zawiera regułę powtarzalności) i generuje wystąpienia:

// 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();

Generuj wystąpienia ze wzorca powtarzalności

Z Aspose.Email można generować wystąpienia ze wzorca powtarzalności. Aby uzyskać „następne” wystąpienie, użyj GenerateOccurrences metody z parametrem nNextOccurrences = 1. Poniższy fragment kodu generuje 20 wystąpień przy użyciu 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);
}

Uzyskaj przyjazny tekst dla powtarzalności

Tekst przyjazny dla użytkownika dla reguły można uzyskać za pomocą FriendlyText właściwość. Wynik następującego kodu to: "Powtarzaj co miesiąc w dniu 1 i 1 od końca miesiąca maksymalnie 2 wystąpienia."

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

Przykładowe wzorce powtarzalności

Poniższe przykładowe ciągi RRULE ilustrują, jak wyrazić typowe harmonogramy.

  • Ostatni dzień miesiąca, każdy miesiąc. Jeśli chcesz uzyskać wystąpienie w dniu przedostatnim, użyj BYMONTHDAY=-2. Jeśli określisz BYMONTHDAY=31, wtedy zgodnie ze standardem iCalendar nie generuje się wystąpienia w miesiącach mających mniej niż 31 dni.

    RRULE:FREQ=MONTHLY;BYMONTHDAY=-1
    
  • Ostatni dzień roboczy każdego miesiąca. Reguła ta określa wszystkie dni robocze miesiąca i wybiera ostatni z nich. Wynikiem jest ostatni dzień roboczy w miesiącu.

    RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
    
  • Ostatni poniedziałek roku.

    RRULE:FREQ=YEARLY;BYDAY=-1MO
    
  • Piątek pierwszego tygodnia ISO 8601 roku. W specyfikacji ISO 8601 pierwszy tydzień roku to pierwszy, który ma co najmniej cztery dni.

    FREQ=YEARLY;BYWEEKNO=1;BYDAY=FR
    
  • Pierwszy piątek roku. W 1999 r. pierwszym piątkiem roku jest 1999/01/01, natomiast piątek pierwszego tygodnia ISO 8601 wypada 1999/01/08.

    FREQ=YEARLY;BYDAY=1FR
    

Ważne szczegóły iCalendar (RFC 2445)

Daty lub daty z powiązanymi czasami mogą być używane w elementach DTSTART, UNTIL, EXDATE i RDATE przy określaniu wzorca powtarzalności. iCalendar definiuje typ wartości DATE, aby oznaczyć wartości zawierające datę kalendarzową, oraz typ DATE‑TIME, aby określić dokładną datę i godzinę. Wartości DATE‑TIME mogą być podawane w trzech formach: czas lokalny, czas UTC oraz czas lokalny ze strefą czasową.

  • DATE. Zgodnie ze standardem iCalendar, wartości DATE muszą spełniać yyyyMMdd format. Na przykład, 19970714 reprezentuje 14 lipca 1997.
  • DATE‑TIME z czasem lokalnym. Forma daty‑czasu lokalnego to po prostu wartość daty‑czasu, która nie zawiera oznaczenia UTC i nie odwołuje się do strefy czasowej. Na przykład, DTSTART:19980118T230000 reprezentuje 18 stycznia 1998, godz. 23:00. Wartości daty‑czasu tego typu są określane jako „pływające” i nie są powiązane z żadną konkretną strefą czasową. Reprezentują tę samą godzinę, minutę i sekundę niezależnie od aktualnie obowiązującej strefy czasowej.
  • DATE‑TIME w czasie UTC. Data z czasem UTC (czas absolutny) jest oznaczona wielką literą Z dołączony do wartości czasu. Na przykład, DTSTART:19980119T070000Z reprezentuje 19 stycznia 1998, godz. 07:00 UTC. Należy zauważyć, że Aspose.Email ignoruje przyrostek UTC Z przyrostek i traktuje czas jako lokalny. Standard RFC 2445 stwierdza, że część czasu podana w regule UNTIL wzorca powtarzalności musi być w formacie UTC; Aspose.Email akceptuje czas w dowolnym formacie w regule UNTIL.
  • DATE‑TIME z czasem lokalnym i strefą czasową. Aby odwołać się do strefy czasowej, DATE‑TIME jest modyfikowane właściwością TZID. Na przykład, DTSTART;TZID=US-Eastern:19980119T020000 reprezentuje godzinę 2:00 w Nowym Jorku 19 stycznia 1998. Należy zauważyć, że Aspose.Email obecnie ignoruje parametr TZID i traktuje czas jako czas lokalny.
  • Zgodność BYWEEKNO i ISO 8601. Używaj BYWEEKNO tylko wtedy, gdy wymagana jest ISO 8601 jest wymagane. Numery tygodni zgodnie z ISO 8601 różnią się od zwykłych numerów tygodni: pierwszy tydzień roku kalendarzowego to pierwszy tydzień, który zawiera co najmniej cztery dni. Reguła BYWEEKNO określa listę liczb oddzielonych przecinkiem identyfikujących tygodnie roku (wartości od 1 do 53 i od -1 do -53) i jest ważna tylko dla reguł YEARLY.

Zobacz także