لإنشاء تسمية نشر تتضمن الشهر واليوم على Mac، اطلب هذين الحقلين باستخدام المنسّق Foundation في Swift، ودع إعدادات اللغة المحلية ترتبهما. حدّد أولاً ما إذا كان إدخالك تاريخاً تقويمياً أم طابعاً زمنياً: فهذا يحدد ما إذا كانت المنطقة الزمنية ستغيّر اليوم المعروض.

يشرح هذا الدليل سكربتاً صغيراً في Terminal لإنشاء تسميات نشر من تواريخ اصطناعية. يستخدم Date.FormatStyle للعملية الأساسية، ويعرض البديل القائم على القوالب للشفرة الموجودة التي تستخدم DateFormatter. توثّق Apple كلا النهجين لإخراج التواريخ وفق اللغة المحلية. Date.FormatStyle، DateFormatter

اطلب الشهر واليوم كحقلين، لا كنمط مكتمل

نمط مثل MMMM d يثبّت الشهر قبل اليوم. يحدد طلب الحقول وفق اللغة المحلية ما يجب تضمينه، مع ترك الترتيب للمنسّق. في Swift، التعبير المعني هو Date.FormatStyle().month(.wide).day(). وتذكر Apple صراحةً أن ترتيب مُعدِّلات التنسيق لا يؤثر في السلسلة الناتجة. لذلك فإن استدعاء .day() أولاً لا يفرض إخراج اليوم قبل الشهر. Date.FormatStyle

بالنسبة إلى تاريخ النشر الاصطناعي 12 نوفمبر 2026، فإن التسميات التوضيحية هي November 12 مع en_US و12 November مع en_GB. هذان عرضان تجريبيان بإعدادَي لغة محلية صريحين؛ كما يطبع السكربت الفعلي تسمية باستخدام اللغة المحلية الحالية في Mac. وتعرض Apple الفرق نفسه في ترتيب الشهر واليوم عبر واجهة القوالب الموطّنة. DateFormatter

تصف Unicode الفرق الأساسي عبر هياكل التواريخ: فهي تحتوي على الحقول المطلوبة وأطوالها، ويطابقها البرنامج مع نمط موطّن مناسب. على سبيل المثال، يطلب MMMd شهراً مختصراً ويوماً. لكنه لا يفرض شرطة مائلة أو مسافة أو ترتيب العرض النهائي. هذا هو المبدأ المفيد الذي يمكن نقله بين واجهات البرمجة: اختر المكونات، ثم دع المنسّق يركّب التسمية. المعيار التقني لـ Unicode رقم 35، الجزء 4: التواريخ

حدّد ما يمثله تاريخ النشر

قبل التنسيق، اختر الصف المناسب أدناه. يمنع هذا القرار من عرض منسّق صحيح ليوم تقويمي غير مقصود.

الإدخال المعنى قرار التنسيق
السنة 2026، الشهر 11، اليوم 12 تاريخ مدني: يوم واحد في تقويم محدد احتفظ بهذه الحقول؛ واستخدم تقويماً ومنطقة زمنية متسقين عند التحويل عبر Date
2026-11-12T00:30:00Z طابع زمني يحدد لحظة زمنية حلّل اللحظة، ثم اختر المنطقة الزمنية التي ستعرضها فيها
+02:00 إزاحة رقمية عن UTC تكفي لربط طابع زمني محلي بـ UTC؛ لكنها لا تحدد منطقة مسماة
Europe/London معرّف منطقة زمنية مسماة استخدم قواعدها للحظة المعروضة

تعرّف Apple Date على أنها نقطة زمنية مستقلة عن أي تقويم أو منطقة زمنية. وتحتوي DateComponents على حقول مثل السنة والشهر واليوم، التي تُفسّر باستخدام تقويم ومنطقة زمنية. لذلك، يحتاج سجل النشر الذي يحتوي على تاريخ فقط إلى اصطلاح تحويل صريح عند تمريره إلى واجهة برمجة تنسّق Date. Date، DateComponents

في هذه المهمة، الاصطلاح بسيط: احتفظ بالسنة والشهر واليوم من المصدر، وأنشئ تاريخاً وفق التقويم الغريغوري عند الظهر بتوقيت UTC، ثم نسّقه باستخدام التقويم نفسه ومنطقة UTC. الظهر مجرد نقطة مرجعية مختارة لهذا المثال. ما يحفظ التاريخ هو اتساق الإنشاء والتنسيق. ولا تعني هذه النقطة المرجعية أن هذا هو وقت النشر الفعلي.

أما الطابع الزمني الحقيقي، فاختر منطقة العرض المقصودة. تتحكم اللغة المحلية في طريقة العرض، لكنها لا تحدد المنطقة المقصودة للطابع الزمني. وقد تكون للمنطقة المسماة إزاحات مختلفة في لحظات مختلفة، بينما لا توفر الإزاحة الرقمية الثابتة مثل هذه القواعد. تتيح Apple معرّفات المناطق الزمنية وعمليات الحصول على الإزاحة عند تاريخ محدد. يحدد RFC 3339 إزاحات الطوابع الزمنية، ويوسّع RFC 9557 هذا التمثيل ليحمل معلومات إضافية، من بينها منطقة زمنية. TimeZone، RFC 3339، RFC 9557

شغّل منسّقاً كاملاً للشهر واليوم في Terminal

استخدم macOS 12 أو أحدث، مع توفر مجموعة أدوات Swift وحزمة تطوير برامج macOS. توثّق Apple أن المُهيّئ Date.FormatStyle المستخدم هنا متاح ابتداءً من macOS 12. وتوفر صفحة التثبيت الرسمية لـ Swift إرشادات إعداد Mac، بما فيها Xcode للتطوير على منصات Apple. مُهيّئ نمط التنسيق، تثبيت Swift — macOS

احفظ البرنامج الكامل التالي باسم MonthDay.swift في محرر نصوص عادي. يحتوي على بيانات نموذجية اصطناعية، ويتحقق من حقول التقويم، ويطبع معاينات باللغة المحلية الحالية وبإعدادات لغة محلية صريحة. كما يطبع النتيجة المكافئة القائمة على القوالب لتتمكن من مقارنة واجهتي البرمجة.

import Foundation

enum LabelError: Error {
    case unavailableUTC
    case invalidPublicationDate
}

func main() throws {
    guard let utc = TimeZone(secondsFromGMT: 0) else {
        throw LabelError.unavailableUTC
    }

    var calendar = Calendar(identifier: .gregorian)
    calendar.timeZone = utc

    // Synthetic civil publication date, not an actual timestamp.
    var fields = DateComponents()
    fields.calendar = calendar
    fields.timeZone = utc
    fields.year = 2026
    fields.month = 11
    fields.day = 12
    fields.hour = 12

    guard fields.isValidDate(in: calendar),
          let publicationDate = calendar.date(from: fields) else {
        throw LabelError.invalidPublicationDate
    }

    let previews: [(String, Locale)] = [
        ("Current locale", .current),
        ("en_US", Locale(identifier: "en_US")),
        ("en_GB", Locale(identifier: "en_GB"))
    ]

    for (name, locale) in previews {
        let style = Date.FormatStyle(
            locale: locale,
            calendar: calendar,
            timeZone: utc
        )
        .month(.wide)
        .day()

        print("\(name): \(publicationDate.formatted(style))")

        let formatter = DateFormatter()
        formatter.locale = locale
        formatter.calendar = calendar
        formatter.timeZone = utc
        formatter.setLocalizedDateFormatFromTemplate("MMMMd")

        print("\(name), template: \(formatter.string(from: publicationDate))")
    }
}

try main()

افتح Terminal، وانتقل إلى المجلد الذي يحتوي على الملف، وشغّل swift MonthDay.swift. إذا لم تكن مجموعة أدوات Swift متاحة، فأكمل خطوات التثبيت الرسمية لـ Mac قبل المتابعة. جرت مراجعة هذا المثال بمقارنته مع التوثيق، لكن لم يُنفّذ في بيئة البحث هذه لعدم توفر Swift.

ينبغي أن تعرض المعاينتان الصريحتان ترتيب الشهر أولاً واليوم أولاً للتاريخ نفسه، 12 نوفمبر. يتبع سطر اللغة المحلية الحالية إعداد اللغة المحلية الحالي في Mac. ويطلب مسارا التنسيق كلاهما اسم الشهر كاملاً واليوم، من دون إضافة سنة أو وقت. تعامل مع الناتج على أنه نص للعرض وفق اللغة المحلية؛ وتجنب جعل المعالجة اللاحقة تعتمد على مسافة أو علامة ترقيم بعينها. يسمح نموذج مطابقة الأنماط في Unicode بترتيبات تختلف باختلاف اللغة المحلية. المعيار التقني لـ Unicode رقم 35، الجزء 4: التواريخ

استخدام التقويم الغريغوري في هذا البرنامج مقصود: فحقول المصدر الاصطناعية محددة وفق هذا التقويم. ويبقى التقويم ثابتاً بينما تغيّر اللغة المحلية طريقة العرض. إذا كانت تواريخ المصدر تستخدم تقويماً آخر، ففسّر حقولها باستخدام ذلك التقويم قبل تحديد كيفية عرضها. يفصل مُهيّئ Apple لهذا الغرض بين اللغة المحلية والتقويم والمنطقة الزمنية. مُهيّئ نمط التنسيق

استخدم قالباً موطّناً في الشفرة الموجودة التي تستخدم DateFormatter

يستخدم المسار الثاني في البرنامج setLocalizedDateFormatFromTemplate("MMMMd"). هنا، يطلب MMMM شهراً كاملاً، ويطلب d يوماً من الشهر. السلسلة قالب يُمرّر إلى دالة توطين؛ ولا تُسنَد مباشرةً على أنها dateFormat النهائية. يستخدم مثال Apple نفسه هذا القالب لإنتاج ترتيبات مختلفة للشهر واليوم. DateFormatter

اضبط locale قبل استدعاء دالة القالب. تشترط Apple هذا الترتيب صراحةً، لأن الدالة تستنبط التنسيق باستخدام اللغة المحلية للمنسّق في تلك اللحظة. إذا اخترت لغة محلية أخرى لاحقاً، فاستدعِ دالة القالب مجدداً. ينشئ المثال منسّقاً جديداً لكل معاينة، ما يجعل هذا الاعتماد واضحاً. setLocalizedDateFormatFromTemplate(_:)

لهذه المهمة، اختر المسار الذي يناسب شفرتك الحالية: مُعدّلات الحقول في واجهة Swift الحديثة، أو دالة القوالب الموطّنة ضمن سير عمل DateFormatter. تجنب تركيب سلسلتي الشهر واليوم المنسّقتين كلٌّ على حدة باستخدام فاصل من اختيارك، لأن ذلك ينقل مسؤولية الترتيب بعيداً عن منسّق التاريخ.

تعامل مع الطوابع الزمنية دون تغيير المطلوب عن غير قصد

لنفترض أن المصدر يزوّدك بدلاً من ذلك بالطابع الزمني الاصطناعي 2026-11-12T00:30:00Z. فهو يحدد لحظة زمنية. عرضه عند الإزاحة +00:00 يعطي 12 نوفمبر؛ وعرض اللحظة نفسها عند الإزاحة -02:00 يعطي 11 نوفمبر عند 22:30. هذا حساب توضيحي للإزاحة، وليس حدث نشر مرصوداً. يحدد RFC 3339 الإزاحات الرقمية على أنها الوقت المحلي مطروحاً منه UTC. RFC 3339، القسم 4.2

حلّل هذا الإدخال باستخدام واجهة ISO 8601 مهيّأة للتمثيل الفعلي، ثم نسّق اللحظة الناتجة باستخدام منطقة العرض المختارة. توثّق Apple ISO8601DateFormatter وخياره .withInternetDateTime لسلاسل التاريخ والوقت وفق RFC 3339. هذا الخيار إعداد للتحليل، وهو منفصل عن طلب إخراج الشهر واليوم وفق اللغة المحلية. خيارات التنسيق في ISO8601DateFormatter

لا تطبّق سير عمل الطابع الزمني هذا على مصدر لا يقدم سوى تاريخ مدني، إلا إذا كنت قد حددت اصطلاح التحويل عمداً. وبالمثل، لا تفترض أن اللاحقة Z تحدد المنطقة الزمنية المسماة للنشر. يتعامل RFC 9557 مع معلومات المنطقة المسماة على أنها معلومات إضافية تتجاوز التمثيل الأساسي للطابع الزمني. RFC 9557

شخّص التسمية غير المتوقعة بالترتيب الصحيح

اتبع هذا التسلسل لتحديد القرار الذي يحتاج إلى تغيير:

  1. اليوم غير صحيح: تحقق مما إذا كان الإدخال تاريخاً مدنياً أم لحظة زمنية. في برنامج التاريخ المدني، أبقِ الإنشاء والتنسيق على UTC. أما للحظة زمنية، فتحقق من منطقة العرض المقصودة.
  2. يظهر الشهر واليوم بترتيب غير صحيح: افحص اللغة المحلية التي مرّرتها إلى المنسّق، وتحقق من عدم تعيين dateFormat مباشرةً أو وصل السلاسل يدوياً.
  3. لا يؤثر تغيير ترتيب المُعدّلات: هذا سلوك موثّق. اختر اللغة المحلية المناسبة بدلاً من إعادة ترتيب .month() و.day().
  4. يحتفظ ناتج القالب بترتيب سابق: اضبط اللغة المحلية الجديدة، ثم أنشئ التنسيق مجدداً باستخدام setLocalizedDateFormatFromTemplate.
  5. حقول المصدر غير صالحة: أبلغ عن الإدخال أو صححه. يتحقق البرنامج الكامل من الصلاحية قبل التحويل، بدلاً من استبدال تاريخ نشر آخر به.

تتبع هذه الفحوص الفصل الموثّق بين اللحظة الزمنية وتفسيرها التقويمي وطريقة عرضها وفق اللغة المحلية. توثّق Apple استقلالية ترتيب المُعدّلات، وترتيب إعداد القالب، والتحقق من صلاحية مكونات التاريخ في واجهات البرمجة المعنية. Date.FormatStyle، setLocalizedDateFormatFromTemplate(_:)، DateComponents

احتفظ بتاريخ المصدر الكامل أو طابعه الزمني بعد إنشاء التسمية. فالسلسلة التي تتضمن الشهر واليوم تحذف السنة عمداً، كما تحذف تسمية الطابع الزمني المنسّقة الوقت والمنطقة الزمنية؛ لذا لا يمكن لنص العرض هذا الاحتفاظ بالإدخال الكامل. للحصول على تسمية نشر موثوقة، احتفظ بالقيمة الأصلية، واختر التقويم والمنطقة الزمنية بعناية، ودع اللغة المحلية ترتب الشهر واليوم المطلوبين.

المصادر