Menu
flag Ar iconالعربيةdown icon

تنسيق DateTime في C#: نصوص التنسيق القياسية والمخصصة والثقافة وISO 8601

كيف تنسّق DateTime كنص في C#: نصوص التنسيق القياسية (d وD وo وs وu وt)، والأنماط المخصصة مثل yyyy-MM-dd HH:mm:ss، وجدول كامل للمحدّدات، وكيف تغيّر الثقافة المخرجات، والذهاب والإياب بصيغة ISO 8601 عبر "o"، وأخطاء mm مقابل MM وhh مقابل HH.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تحوّل DateTime.ToString(format) التاريخ إلى نص. يكون التنسيق إما نص تنسيق قياسيًا (حرفًا واحدًا مثل d أو o، يأتي نمطه الدقيق من الثقافة) أو نمطًا مخصصًا مبنيًا من محدّدات مثل yyyy وMM وHH. تعمل النصوص نفسها في الاستيفاء، $"{date:yyyy-MM-dd}"، وفي string.Format.

المخرجات:

2026-10-09
2026-10-09 18:30:07
09/10/2026
Oct 9, 2026
Friday, October 9
6:30 PM
18:30:07.045
Shipped 2026-10-09 at 18:30

تمرّر أمثلة هذه الصفحة CultureInfo.InvariantCulture كي تكون المخرجات واحدة على كل جهاز؛ ودونها تستخدم ToString الثقافة الحالية، التي قد تغيّر أسماء الأشهر والفواصل وحتى التقويم.

محدّدات التنسيق المخصصة

التنسيق المخصص نمط تمثّل فيه أحرف معينة أجزاء التاريخ. وهي حساسة لحالة الأحرف: M للشهر وm للدقيقة، وH للساعة بنظام 24 ساعة وh للساعة بنظام 12 ساعة.

المحدّدالمعنىمثال لـ 2026-10-09 18:30:07.045
yyyyالسنة، 4 أرقام2026
yyالسنة، رقمان26
MMMMاسم الشهر كاملًاOctober
MMMاسم الشهر مختصرًاOct
MMالشهر، رقمان10
Mالشهر، رقم أو رقمان10
ddddاسم اليوم كاملًاFriday
dddاسم اليوم مختصرًاFri
ddيوم الشهر، رقمان09
dيوم الشهر، رقم أو رقمان (داخل نمط)9
HHالساعة، من 00 إلى 2318
Hالساعة، من 0 إلى 2318
hhالساعة، من 01 إلى 1206
hالساعة، من 1 إلى 126
mmالدقيقة، رقمان30
ssالثانية، رقمان07
fffأجزاء الألف من الثانية045
fffffffالنبضات (سبعة أرقام كسرية)0450000
ttمؤشر AM/PMPM
zzzالإزاحة عن UTC (DateTimeOffset أو الوقت المحلي)+02:00
Kمعلومات المنطقة: Z أو إزاحة أو لا شيءZ (لقيمة UTC)
/فاصل التاريخ في الثقافة/ أو . أو -
:فاصل الوقت في الثقافة:
'text' أو \cنص أو محرف حرفي'at'

أي محرف آخر يُنسخ كما هو. ويشمل ذلك الأحرف التي ليست محدّدات، وبهذا تطبع "YYYY-DD" بصمت YYYY-DD: لا يوجد في .NET محدّد Y أو D بحرف كبير.

الحرف المفرد وحده يُقرأ تنسيقًا قياسيًا لا مخصصًا: ToString("d") هو نمط التاريخ القصير، لا رقم اليوم. للحصول على اليوم وحده اكتب ToString("%d") أو استخدم الخاصية Day.

المخرجات:

10/09/2026
9
20261009_183007
Week of Oct 9
18h30
2026-10-09T18:30:07
YYYY-DD

نصوص التنسيق القياسية

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

المخرجات:

d  10/09/2026
D  Friday, 09 October 2026
f  Friday, 09 October 2026 18:30
g  10/09/2026 18:30
G  10/09/2026 18:30:07
M  October 09
Y  2026 October
t  18:30
T  18:30:07
o  2026-10-09T18:30:07.0000000Z
s  2026-10-09T18:30:07
u  2026-10-09 18:30:07Z
r  Fri, 09 Oct 2026 18:30:07 GMT
en-US d: 10/9/2026, D: Friday, October 9, 2026
الرمزالاسميعتمد على الثقافة؟
d / Dتاريخ قصير / طويلنعم
t / Tوقت قصير / طويلنعم
f / Fتاريخ طويل مع وقت قصير / طويلنعم
g / Gتاريخ قصير مع وقت قصير / طويلنعم
Mالشهر واليومنعم
Yالسنة والشهرنعم
oذهاب وإياب ISO 8601، 7 أرقام كسرية، المنطقةلا
sISO 8601 قابل للفرز، بلا كسور، بلا منطقةلا
uعالمي قابل للفرز، ينتهي بـ Zلا
rRFC 1123، لترويسات HTTPلا

تنتج o وs وu وr النص نفسه في كل ثقافة، وهذا يجعلها آمنة للسجلات وأسماء الملفات وتبادل البيانات. لاحظ أن u وr على DateTime لا تحوّلان القيمة إلى UTC؛ بل تطبعانها كما هي وتصفانها بأنها UTC، فاستدعِ ToUniversalTime() أولًا (أو استخدم DateTime.UtcNow) إن كانت القيمة محلية. (على DateTimeOffset تحوّلان فعلًا.)

الثقافة تغيّر المخرجات

التنسيقات القياسية وأسماء الأشهر والأيام والفاصلان / و: كلها تأتي من الثقافة. مرّر واحدة وسيطًا ثانيًا إلى ToString:

المخرجات:

en-US  10/9/2026
en-GB  09/10/2026
de-DE  09.10.2026
fr-FR  09/10/2026
ja-JP  2026/10/09
Freitag, 9. Oktober 2026
vendredi 9 octobre 2026
09.10.2026
09/10/2026

بيانات الثقافة ليست مجمّدة. تقرؤها .NET على Linux وmacOS من مكتبة ICU المثبّتة على النظام، ومنذ .NET 5 تفعل ذلك أيضًا .NET على Windows 10 وما بعده (تستخدم .NET Framework بيانات NLS الخاصة بـ Windows)، فقد يتغيّر النمط قليلًا بين الإصدارات والمنصات: إصدارات ICU الحديثة مثلًا تضع مسافة ضيقة غير فاصلة بدل المسافة العادية قبل "PM" في تنسيق الوقت القصير الأمريكي، وبعضها يعطي التواريخ الإسبانية القصيرة دون الصفر البادئ. وهذا سبب إضافي لعدم قراءة نص نُسّق للعرض أبدًا.

تنتج عن ذلك قاعدتان. للنص الذي يقرؤه شخص نسّق بثقافته (على الخادم، ثقافة الطلب لا ثقافة الخادم) وفضّل التنسيقات القياسية، فيرى القارئ الألماني 09.10.2026 والأمريكي 10/9/2026. وللنص الذي يقرؤه برنامج استخدم CultureInfo.InvariantCulture ونمطًا لا لبس فيه مثل yyyy-MM-dd أو o. التاريخ المكتوب بالثقافة الحالية والمقروء على جهاز آخر مصدر تقليدي لتبادل مواضع الأيام والأشهر.

ISO 8601 والذهاب والإياب بـ "o"

تكتب صيغة الذهاب والإياب "o" كل النبضات مع معلومات المنطقة، فتعيد قراءة النص قيمة DateTime نفسها تمامًا، بما في ذلك Kind:

المخرجات:

2026-10-09T18:30:07.0450000Z
2026-10-09T18:30:07.0450000
2026-10-09T20:30:07.0000000+02:00
True
Utc
2026-10-09T18:30:07Z
2026-10-09 20:30 +02:00

تميّز اللاحقة Z توقيت UTC؛ ولا تحصل قيمة DateTime ذات Kind من نوع Unspecified على لاحقة؛ ويحصل الوقت المحلي أو DateTimeOffset على إزاحته (+02:00). اقرأ بـ DateTimeStyles.RoundtripKind كي تنجو Kind. تقرأ أدوات تسلسل JSON وقواعد البيانات وDate في JavaScript هذه الصيغة كلها.

تنسيق TimeSpan

لـ TimeSpan مجموعة محدّدات مخصصة خاصة به وأصغر: d (الأيام) وhh وmm وss وfff. بخلاف DateTime يجب هروب كل محرف حرفي، بما في ذلك : و.، بشرطة مائلة عكسية أو وضعه بين علامتي اقتباس:

المخرجات:

1.03:25:09.1200000
1.03:25:09.1200000
03:25:09
1.03:25
25:09.120
27:25

hh في تنسيق TimeSpan هي مكوّن الساعات (من 0 إلى 23)، فتُطبع مدة 27 ساعة كـ 03. للمجاميع التي تتجاوز يومًا احسب من TotalHours كما في السطر الأخير. وترمي elapsed.ToString("hh:mm") دون الشرطة المائلة العكسية استثناء FormatException.

أخطاء شائعة

  • mm للشهر. تطبع "yyyy-mm-dd" الدقائق في المنتصف: 2026-30-09. الشهر هو MM.
  • hh دون tt. "hh:mm" ساعة بنظام 12 ساعة دون AM أو PM، فتكون 06:30 ملتبسة. استخدم HH لوقت بنظام 24 ساعة.
  • YYYY وDD. ليسا محدّدين في .NET؛ يُطبعان حرفيًا. استخدم yyyy وdd.
  • / في نمط للبيانات. هو فاصل التاريخ في الثقافة. ضعه بين علامتي اقتباس أو استخدم الثقافة الثابتة.
  • ToString() الافتراضية في السجلات أو الملفات. يعتمد التنسيق على الجهاز. مرّر تنسيقًا وثقافة.
  • وقت محلي موصوف بأنه UTC. لا تحوّل "u" و"r" و'Z' المكتوبة يدويًا؛ حوّل أولًا.
  • القراءة بنمط غير الذي كتبت به. احفظ نصوص تنسيق البيانات في ثابت واحد واستخدمه مع ToString وParseExact كليهما.

الأسئلة الشائعة

كيف أنسّق DateTime بصيغة yyyy-MM-dd في C#؟

تعطي date.ToString("yyyy-MM-dd") القيمة 2026-10-09. وفي نص مستوفى اكتب $"{date:yyyy-MM-dd}". أضف " HH:mm:ss" للوقت بنظام 24 ساعة. مرّر CultureInfo.InvariantCulture وسيطًا ثانيًا حين يكون النص لملف أو لبرنامج آخر، كي لا يعتمد التقويم وأسماء الأشهر والفواصل على الجهاز أبدًا.

ما الفرق بين mm وMM في تنسيقات التاريخ في C#؟

MM هو الشهر (من 01 إلى 12) وmm هي الدقيقة (من 00 إلى 59). التنسيق حساس لحالة الأحرف، فتطبع yyyy-mm-dd الدقائق مكان الشهر، وهو خطأ يسهل أن يفوتك حين تنظر إلى قيمة واحدة. وبالمثل HH هي الساعة بنظام 24 ساعة وhh الساعة بنظام 12 ساعة.

كيف أنسّق DateTime بصيغة ISO 8601 في C#؟

استخدم صيغة الذهاب والإياب "o": تعطي DateTime.UtcNow.ToString("o") القيمة 2026-10-09T18:30:07.0450000Z، بسبعة أرقام كسرية وZ لتوقيت UTC أو إزاحة للأوقات المحلية. وتعطي "s" الشكل الأقصر القابل للفرز دون كسور أو منطقة، و"yyyy-MM-ddTHH:mm:ssZ" بديل مخصص شائع.

كيف أُظهر AM وPM في تنسيق تاريخ في C#؟

استخدم hh أو h لنظام 12 ساعة وtt لمؤشر AM/PM: تعطي date.ToString("h:mm tt", CultureInfo.GetCultureInfo("en-US")) القيمة 6:30 PM. يأتي المؤشر من الثقافة، وبعض الثقافات بلا مؤشر، فمرّر ثقافة صراحة حين تحتاج إلى AM وPM.

لماذا يُظهر تنسيق التاريخ عندي نقاطًا بدل الشرطات المائلة؟

في نص التنسيق ليست / شرطة مائلة حرفية بل فاصل التاريخ في الثقافة، و: فاصل الوقت في الثقافة. على جهاز ألماني تطبع dd/MM/yyyy القيمة 09.10.2026. ضع المحرف بين علامتي اقتباس لفرضه، dd'/'MM'/'yyyy، أو نسّق بـ CultureInfo.InvariantCulture.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن