إدارة المواعيد: الإنشاء والمعالجة، تحويل ICS إلى MSG

تغطي هذه المقالة المواعيد المستندة إلى iCalendar (ICS) التي يتم التعامل معها عبر Appointment الفئة. للعمل مع Outlook MapiCalendar العناصر بدلاً من ذلك، انظر إدارة عناصر تقويم Outlook; لتخزين وقراءة عناصر التقويم داخل ملف PST، انظر إدارة عناصر التقويم في ملفات PST.

إنشاء موعد وحفظه على القرص بصيغة MSG أو ICS

الـ Appointment الفئة في Aspose.Email for .NET يمكن استخدامها لإنشاء موعد جديد. في هذه المقالة، نقوم أولاً بإنشاء موعد وحفظه على القرص بصيغة ICS. الخطوات التالية مطلوبة لإنشاء موعد وحفظه على القرص.

  1. إنشاء مثيل من الـ Appointment الفئة وتهيئتها باستخدام هذا المُنشئ.
  2. مرّر المتغيّرات التالية في المُنشئ أعلاه
    1. الموقع
    2. الملخص
    3. الوصف
    4. تاريخ البدء
    5. تاريخ الانتهاء
    6. المنظم
    7. الحضور
  3. استدعِ الـ Save() الطريقة وتحديد اسم الملف والتنسيق في المتغيرات.

يمكن فتح الموعد في Microsoft Outlook أو أي برنامج يمكنه تحميل ملف ICS. إذا تم فتح الملف في Microsoft Outlook، يضيف الموعد تلقائيًا إلى تقويم Outlook.

يوضح المقتطف البرمجي التالي كيفية إنشاء وحفظ موعد على القرص بصيغة ICS أو 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.");

إنشاء موعد بمحتوى HTML

يمكنك تحديد تمثيلات بديلة لوصف الحدث بأنواع محتوى مختلفة باستخدام رأس X-ALT-DESC. يسمح ذلك لمستلمي ملف iCalendar باختيار التمثيل الأنسب لاحتياجاتهم. على سبيل المثال، يمكنك تضمين وصف نصي بسيط باستخدام نوع المحتوى "text/plain" ووصف HTML باستخدام نوع المحتوى "text/html". يُضاف رأس X-ALT-DESC لكل تمثيل بديل. لإنشاء موعد بمحتوى HTML، اضبط الـ HtmlDescription خاصية.

جرّب مثال الشيفرة التالي لإنشاء موعد مع وصف HTML بديل:

  1. أنشئ نسخة جديدة من فئة Appointment.
  2. قدم المعاملات اللازمة إلى منشئ الفئة Appointment:
    • حدد موقع الموعد.
    • اضبط تاريخ ووقت البدء.
    • اضبط تاريخ ووقت النهاية.
    • حدد المنظم.
    • حدد الحضور.
  3. اضبط HtmlDescription خاصية لكائن الموعد، تشير إلى أن الوصف بتنسيق HTML.
  4. اضبط خاصية Description لكائن الموعد إلى سلسلة منسقة بـ HTML، محاطة بسلسلة متعددة الأسطر:
    • يتضمن ترميز HTML كتلة <style> تُعرّف فئة CSS باسم "text" مع أنماط الخط.
    • يحتوي جسم HTML على علامة الفقرة <p> مع فئة CSS "text"، والرسالة الفعلية للدعوة.
  5. كائن الموعد جاهز الآن، ويمكنك إجراء عمليات إضافية أو حفظه كملف 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>"
};

إنشاء طلب موعد مسودة

تم توضيح في مقالاتنا السابقة كيفية إنشاء وحفظ موعد بصيغة ICS. غالبًا ما يُطلب إنشاء طلب موعد في وضع مسودة، بحيث تُضاف المعلومات الأساسية ثم يتم توجيه نفس طلب الموعد المسودة إلى مستخدمين آخرين لإجراء التغييرات اللازمة وفقًا للاستخدامات الفردية. لتخزين موعد في وضع مسودة، يجب على MethodType خاصية من فئة Appointment يجب ضبطها إلى AppointmentMethodType.Publish. يوضح المقتطف البرمجي التالي كيفية إنشاء طلب موعد مسودة.

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

إنشاء موعد مسودة من نص

تُظهر القطعة البرمجية التالية كيفية إنشاء موعد مسودة من نص. 

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

تخصيص المواعيد

تحديد حالة المشاركين من حضور الموعد

تسمح لك واجهة Aspose.Email for .NET بضبط حالة المشاركين في الموعد أثناء صياغة رسالة رد. يضيف هذا الخاصية PARTSTAT إلى ملف 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);

تخصيص معرف المنتج لـ iCalendar

تتيح واجهة Aspose.Email for .NET إمكانية الحصول على أو ضبط معرف المنتج الذي أنشأ كائن 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);

تحميل المواعيد

أيضًا، الـ Appointment يمكن استخدام الفئة لتحميل موعد من ملف ICS.

تحميل موعد بتنسيق ICS

لتحميل موعد بتنسيق ICS، يلزم اتباع الخطوات التالية:

  1. إنشاء مثيل من الـ Appointment فئة.
  2. استدعِ الـ Load() method عن طريق توفير مسار ملف ICS.
  3. قراءة أي خاصية للحصول على أي معلومات من الموعد (ملف ICS).

يوضح المقتطف البرمجي التالي كيفية تحميل موعد بصيغة 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);

تحويل ICS إلى MSG

تتيح لك الواجهة برمجة التطبيقات تحويل موعد بسهولة إلى كائن رسالة. يوضح مثال الشيفرة التالي كيفية تحويل طلب موعد إلى MailMessage أو MapiMessage:

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

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

قراءة أحداث متعددة من ملف 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...

كتابة أحداث متعددة إلى ملف ‎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);
    }
}

تحديد نسخة الموعد

لتحديد نسخة الموعد، يمكنك استخدام الـ Appointment.Version خاصية الـ Appointment الفئة. تساعد هذه الخاصية على تحديد أي نسخة تستند إليها ملفاتهم، لضمان التكامل مع الأنظمة والتطبيقات الأخرى.

يعرض نموذج الشيفرة التالي كيفية تنفيذ هذه الخاصية في مشروعك:

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
}

إرسال وإلغاء طلبات الاجتماعات

الـ Appointment فئة، إلى جانب SmtpClient، يمكن استخدامها لإرسال طلبات اجتماعات، طلبات اجتماعات متكررة، تحديثات، وإلغاءات عبر البريد الإلكتروني. يتم إضافة الموعد إلى MailMessage كعرض بديل.

إرسال طلب اجتماع

لإرسال طلب اجتماع، أنشئ Appointment ، أضفها إلى رسالة باستخدام RequestApointment طريقة، وإرسال الرسالة. احفظ UniqueId قيمة لتتمكن من الإشارة إلى نفس الموعد لاحقًا عند إرسال تحديث أو إلغاء.

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

إرسال طلب اجتماع متكرر

لإنشاء طلب اجتماع مع تكرار، عيّن نمط تكرار (على سبيل المثال، WeeklyRecurrencePattern) إلى الـ Appointment.Recurrence خاصية. حفظ معرف الموعد الفريد يجعل من الممكن إرسال تحديثات للموعد لاحقًا.

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

إرسال طلب تحديث موعد

لإرسال تحديث لموعد تم إرساله مسبقًا، يلزم معرف الموعد الفريد. استخدم UpdateAppointment طريقة لبناء العرض البديل للتحديث.

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

إلغاء طلب اجتماع

لإلغاء اجتماع، أنشئ نفس Appointment (باستخدام المعلومات التي خزنتها عندما تم إرسال الطلب)، أضفها إلى رسالة باستخدام CancelAppointment طريقة، وإرسال الرسالة إلى الحضور.

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

العمل مع أنماط تكرار iCalendar

نمط التكرار هو طريقة لوصف جدول زمني معين. يحتوي على ما يكفي من المعلومات لإنشاء قائمة من التكرارات (تواريخ وأوقات) وفقًا لجدول زمني معين. قد يحتوي نمط التكرار على قواعد تكرار تصف الدورات التي تتحد لتكوين النمط الكلي. بشكل عام، كلما كان نمط التكرار أكثر تعقيدًا، كلما احتوى على المزيد من قواعد التكرار.

يمكن أن تشمل أنماط التكرار استثناءات (ليس لت confund with exceptions that represent errors during application execution). تضيف الاستثناءات أو تزيل تواريخ التكرار بالنسبة للنمط الأصلي. يمكن تحديدها كتكرارات صريحة أو كنمط بحد ذاته. أمثلة على أنماط التكرار مع الاستثناءات:

  • كل جمعة ثانية، ما عدا الفترة من يونيو إلى أغسطس.
  • اليوم الأول من كل شهر، ما عدا شهر يناير، حيث يجب أن يكون في اليوم الثاني.

يحدد RFC iCalendar المكونات، مثل VEVENT أو VTODO، التي تمثل أحداثًا أو مهام. يمكن للمكونات أن تحتوي على خصائص مثل تاريخ/وقت البدء، الوصف، الموقع، الحضور، والتكرار. عادةً ما يكون نمط التكرار خاصية لمهمة أو حدث متكرر. خصائص نمط التكرار المحددة بواسطة iCalendar هي:

  • DTSTART – تاريخ ووقت بدء النمط (يمثل أيضًا التكرار الأول إذا لم يُستثنَ صراحة).
  • RRULE – يحدد قاعدة تكرار لمجموعة تكرار.
  • RDATE – يحدد قائمة من التواريخ والأوقات لتضمينها في مجموعة تكرار.
  • EXRULE – يحدد قاعدة تكرار للاستثناءات من مجموعة تكرار.
  • EXDATE – يحدد قائمة من الاستثناءات التاريخية والزمانية من مجموعة تكرار.

فقط DTSTART مطلوب، ويجب أن يكون هناك DTSTART واحد فقط. جميع الخصائص الأخرى اختيارية ويمكن تحديدها أكثر من مرة.

نموذج كائن تكرار Aspose.Email

الـ Aspose.Email.Calendar.Recurrences المساحة الاسمية تحتوي على الفئات المستخدمة للعمل مع تكرارات iCalendar. CalendarRecurrence و RecurrenceRule هي الفئات المركزية، وتوفر تطبيقات ملموسة للعناصر المقابلة في RFC 2445.

  • الـ CalendarRecurrence الفئة تمثل نمط التكرار بالكامل. يمكنك إنشاء نمط تكرار جديد من الصفر باستخدام المنشئ الافتراضي، أو تحميل نمط موجود بتنسيق iCalendar باستخدام الـ FromiCalendar طريقة.
  • الـ RecurrenceRule الفئة تمثّل جزء RRULE أو EXRULE من نمط التكرار. RecurrenceRule يكشف عن عدد من الخصائص التي تتطابق مباشرةً مع نظيراتها في معيار iCalendar. على سبيل المثال، ByMonth تخ mapped إلى BYMONTH في iCalendar، وهكذا. من خلال فحص أو تعيين قيم الـ RecurrenceRule الخصائص، يمكنك تحليل أو تعديل قاعدة التكرار.

يحمّل مقطع الشفرة التالي نمط تكرار (حيث يحتوي الجزء RRULE على قاعدة التكرار) ويولد التكرارات:

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

توليد تكرارات من نمط التكرار

مع Aspose.Email يمكن توليد تكرارات من نمط التكرار. للحصول على التكرار "التالي"، استخدم GenerateOccurrences طريقة مع المعامل nNextOccurrences = 1. يولّد مقطع الشفرة التالي 20 تكرارًا باستخدام 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);
}

احصل على نص صديق للمستخدم لتكرار

يمكن الحصول على نص صديق للمستخدم لقاعدة باستخدام FriendlyText خاصية. ناتج الشفرة التالية هو: "تكرار كل شهر في اليوم الأول ومن النهاية الأول من أيام الشهر بحد أقصى حدوثين."

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

نماذج التكرار النموذجية

توفر سلاسل RRULE النموذجية التالية كيفية التعبير عن جداول زمنية شائعة.

  • آخر يوم من الشهر، كل شهر. إذا كنت تريد تكرارًا في اليوم الذي يسبق آخر يوم من الشهر، استخدم BYMONTHDAY=-2. إذا قمت بتحديد BYMONTHDAY=31، ثم وفقًا لمعيار iCalendar، لا يتم توليد أي تكرار في الشهور التي تحتوي على أقل من 31 يومًا.

    RRULE:FREQ=MONTHLY;BYMONTHDAY=-1
    
  • آخر يوم عمل في كل شهر. تحدد هذه القاعدة جميع أيام العمل في شهر وتختار اليوم الأخير. النتيجة الصافية هي آخر يوم عمل في الشهر.

    RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
    
  • آخر اثنين من السنة.

    RRULE:FREQ=YEARLY;BYDAY=-1MO
    
  • جمعة الأسبوع الأول وفق ISO 8601 من السنة. وفقًا لمواصفات ISO 8601، يكون الأسبوع الأول من السنة هو الأول الذي يحتوي على أربعة أيام على الأقل.

    FREQ=YEARLY;BYWEEKNO=1;BYDAY=FR
    
  • الجمعة الأولى من السنة. في عام 1999، على سبيل المثال، الجمعة الأولى من السنة هي 1999/01/01، بينما جمعة الأسبوع الأول وفق ISO 8601 هي 1999/01/08.

    FREQ=YEARLY;BYDAY=1FR
    

تفاصيل مهمة حول iCalendar (RFC 2445)

يمكن استخدام التواريخ، أو التواريخ مع الأوقات المرتبطة، في عناصر DTSTART وUNTIL وEXDATE وRDATE عند تحديد نمط التكرار. يحدد iCalendar نوع القيمة DATE لتحديد القيم التي تحتوي على تاريخ تقويمي، ونوع القيمة DATE-TIME لتحديد القيم التي تحدد تاريخًا تقويميًا دقيقًا ووقتًا من اليوم. يمكن تحديد قيم DATE-TIME بثلاث صيغ: الوقت المحلي، وقت UTC، والوقت المحلي مع منطقة زمنية.

  • DATE. وفقًا لمعيار iCalendar، يجب أن تتبع قيم DATE yyyyMMdd تنسيق. على سبيل المثال، 19970714 يمثل 14 يوليو 1997.
  • DATE-TIME بالوقت المحلي. صيغة التاريخ بوقت محلي هي ببساطة قيمة تاريخ-وقت لا تحتوي على محدد UTC ولا تشير إلى منطقة زمنية. على سبيل المثال، DTSTART:19980118T230000 يمثل 18 يناير 1998، الساعة 11 مساءً. تُعتبر قيم التاريخ-الوقت من هذا النوع "عائمة" ولا ترتبط بأي منطقة زمنية معينة. إنها تمثل نفس قيمة الساعة والدقيقة والثانية بغض النظر عن المنطقة الزمنية التي يتم ملاحظتها حاليًا.
  • DATE-TIME بوقت UTC. يتم تمييز التاريخ بوقت UTC (الوقت المطلق) بحرف كبير Z اللاحقة المضافة إلى قيمة الوقت. على سبيل المثال، DTSTART:19980119T070000Z يمثل 19 يناير 1998، الساعة 0700 UTC. لاحظ أن Aspose.Email يتجاهل UTC Z اللاحقة وتعالج الوقت كوقت محلي. يذكر معيار RFC 2445 أن الجزء الزمني المحدد في قاعدة UNTIL لنمط التكرار يجب أن يكون بتنسيق UTC؛ Aspose.Email يقبل الوقت بأي تنسيق في قاعدة UNTIL.
  • DATE-TIME بالوقت المحلي والمنطقة الزمنية. للإشارة إلى منطقة زمنية، يتم تعديل DATE-TIME بخاصية TZID. على سبيل المثال، DTSTART;TZID=US-Eastern:19980119T020000 يمثل الساعة 2 صباحًا في نيويورك في 19 يناير 1998. لاحظ أن Aspose.Email يتجاهل حاليًا معلمة TZID ويعامل الوقت كوقت محلي.
  • امتثال BYWEEKNO و ISO 8601. استخدم BYWEEKNO فقط عندما يكون الالتزام بـ ISO 8601 مطلوب. تختلف أرقام الأسابيع حسب تعريف ISO 8601 عن الأرقام المعتادة: رقم الأسبوع الأول من سنة التقويم هو أول أسبوع يحتوي على أربعة أيام على الأقل. تحدد قاعدة BYWEEKNO قائمة مفصولة بفواصل من الأرقام التي تحدد أسابيع السنة (القيم الصالحة من 1 إلى 53 و-1 إلى -53)، وهي صالحة فقط للقواعد السنوية.

انظر أيضًا