متوفر أيضًا بلغات أخرى: English · Español · Português · Français
رموز تنسيق strftime: ماذا ينتج كل رمز، ومن الذي يعرّفه
اكتب سلسلة تنسيق، واقرأ الناتج رمزًا رمزًا، واعرف أي رموزك لن ينجو من تغيّر المنصّة.
ما رموز تنسيق strftime
strftime دالّة في مكتبة C تحوّل التاريخ إلى نصّ، وسلسلة تنسيقها شريط من محارف عادية تتخلله مواصفات تحويل. وكل مواصفة علامة نسبة مئوية تتبعها حرف: فـ%Y السنة بأربعة أرقام، و%m الشهر مصدَّرًا بصفر، و%d اليوم. وكل ما ليس تحويلًا يُنسَخ دون مساس، ولذلك يعطي %Y-%m-%d تاريخًا بشُرَط دون أن تطلب ذلك.
واللغة نفسها تظهر فيما هو أبعد من C بكثير. فبايثون وروبي وPHP وR وبيرل وawk وأمر date في GNU والصدَفة نفسها كلها تقبل سلاسل strftime، وأكثرها يمرّر سلسلتك إلى مكتبة C في الجهاز بدل أن ينفّذها بنفسه. ولهذا بعينه تكون قابلية النقل سؤالًا حيًّا لا هامشًا: فالرموز التي يقبلها برنامجك يقرّرها الجهاز الذي يعمل عليه.
والتحويلات اثنان وأربعون جملةً، وليست كلها من مصدر واحد. فبعضها في معيار C لسنة 1989، وواحد جاء مع C99، واثنا عشر من Single UNIX Specification، وستة من حزمة المناطق الزمنية لأولسون — وهو المشروع نفسه الذي يعطيك قاعدة المناطق الزمنية — وواحد من glibc ذاتها. وكل جدول اختصار منشور يسطّح ذلك في قائمة واحدة، وهو تحديدًا ما تحتاج إليه حين تعمل السلسلة على حاسوبك ولا تعمل في بيئة الإنتاج.
كيف تستعمله
- اكتب سلسلة تنسيق أو اخترها. أزرار الأمثلة تغطي تاريخًا من كل يوم، وآخر منقولًا تمامًا، وسطر سجلّ من Apache، وتاريخ أسبوع ISO، وواحدًا مركَّبًا من التصادمين الحقيقيين في الصياغة.
- اضبط التاريخ والوقت. كلاهما يُقرأ بتوقيت UTC، فالناتج لا يتعلق إلا بما كتبته. وجدول المرجع في الأسفل يُعاد حسابه للحظة التي تختارها، وذلك أسرع في العادة من قراءة وصف.
- اقرأ التفصيل والملاحظات. كل تحويل مذكور ومعه المعيار الذي يعرّفه وما أنتجه. والملاحظات تحته تغطي ما يستحق أن يُعرَف: راية ليست من POSIX، أو تحويل يتجاوز C89، أو مخرج يتغير بتغير الإعداد اللغوي.
أين تنكسر قابلية النقل فعلًا، بالقياس
الظنّ الأول أن خطّ الخطر هو المستوى: الزم C89 تسلَم، واخرج إلى Single UNIX Specification تُصَب. وبقياس تنفيذَين اثنين، يكاد هذا الحدّ لا يعضّ. فـCPython على ويندوز يقبل تحويلات C89 الاثنين والعشرين، وتحويلات Single UNIX Specification الاثني عشر، ومنها %e و%F و%T. فصفحةٌ تُبنى على علامات المستوى إنما تصف هاويةً تآكل أكثرها.
والذي ينكسر هو الرايات، وهي آلية أخرى لا تقول عنها علامات المستوى شيئًا. فـPOSIX يعرّف رايتين اثنتين لا غير، الصفر وعلامة الزائد، ومعهما عرضٌ أدنى للحقل — ثم يعلن أن النتيجة غير محددة متى وُضعت راية بلا عرض أدنى، أو عرضٌ بلا راية. فحتى %0d خارج المعيار: فـPOSIX يريدهما معًا، أي %03d. أما glibc فتعرّف خمس رايات — الشرطة السفلية والشرطة والصفر والسنّة والمربّع — وتقبلها كلها مفردة.
ولهذا كانت أشهر حيلة في strftime على الإنترنت هي بعينها التي تنكسر. فـ%-d، لإسقاط الصفر البادئ، امتدادٌ من glibc في صورة يسميها POSIX غير محددة، وعلى ويندوز لا يتدهور CPython في صمت بل يرفع ValueError. وكذلك %_d و%s و%P و%k و%l، وكلها يجيب عنها GNU بلا اعتراض.
وصورتا الإخفاق غير متناظرتين، وتلك هي الفائدة التي تُحمَل. فويندوز يخفق بصوت عالٍ في %-d، وذلك مزعج لكنه يصحّح نفسه. أما المخرج الذي يلجأ إليه المرء عندئذ، %#d، فهو إملاء مايكروسوفت لإسقاط الصفر البادئ — وglibc تعطي المحرف نفسه معنًى مختلفًا تمامًا. فالمربّع في glibc «الحالة المعاكسة»، ولا يصنع بحقل رقمي شيئًا، فيعود %#d بـ07 لا 7. وليست الراية مُهمَلة: فـ%#A يعيد فعلًا SATURDAY، وبذلك تعرف أنها تُعالَج. محرف واحد، وتعريفان، ولا خطأ من أي من الجهتين.
تصادمان في الصياغة، وحدٌّ مُعترَف به
علامة الزائد راية في POSIX وتحويلٌ تُورده صفحة الدليل، في الموضع نفسه. فـ%+4Y راية بعرض، بينما %+ وحده تحويلٌ معناه التاريخ بصيغة date(1). وتحسم صفحة الدليل الثاني حسمًا غير مألوف: تورده ثم تقول إن glibc2 لا تدعمه. وقد تُحقّق من ذلك: فأمر date في GNU يعيد المحرفين كما هما، وهو ما تفعله هذه الصفحة أيضًا.
والتصادم الآخر بين %G و%Y. فـ%G هي السنة المبنية على الأسابيع في ISO 8601، وتخالف السنة التقويمية أيامًا معدودة حول رأس السنة. فأول يناير 2027 جمعة، فهو من الأسبوع ISO رقم 53 لسنة 2026: يعطي %G-W%V القيمة 2026-W53، بينما يعطي %Y-W%V القيمة 2027-W53 — وهو أسبوع لا وجود له، لأن 2027 فيها اثنان وخمسون أسبوعًا فقط. وبمسح الأربعين سنة من 2000 إلى 2039، يختلف الاثنان في 68 يومًا من 14610، أي 0.47 بالمئة: لا تزيد قط على ثلاثة أيام في السنة الواحدة، وأقل من يومين في المتوسط، وفي بعض السنين لا شيء البتة. وذلك أسوأ تواتر ممكن لملاحظة خلل.
والحدّ المعترف به هو الإعداد اللغوي. فأحد عشر تحويلًا من الاثنين والأربعين تنتج نصًّا تأخذه مكتبة C من الإعداد الجاري: أسماء الأيام والشهور، وعلامتا الصباح والمساء، والثلاثة التي تعرض تاريخًا أو وقتًا كاملًا على العُرف المحلي. وهذه الصفحة تعرضها بلغة الصفحة التي تقرؤها، وهو جواب معقول وليس الجواب الذي سيعطيه خادمك. ولا شيء هنا يستطيع أن يخبرك كيف سيعرض %c جهازٌ مضبوط على إعداد لغوي آخر، وأداةٌ تدّعي غير ذلك إنما تخمّن.
وأمران أصغر. كل شيء يُنسَّق بتوقيت UTC، فـ%z دائمًا +0000 و%Z دائمًا UTC، بينما البرنامج الحقيقي ينسّق بالمنطقة التي سُلّمت إليه. و%s، أي الثواني منذ الحقبة، من حزمة المناطق الزمنية لا من أي معيار لـC، ولذلك كان من التحويلات التي يرفضها ويندوز رفضًا مباشرًا.
لماذا هو مجاني؟
تحويل التاريخ إلى نصّ حسابٌ وجدول بحث، وكلاهما يجري في متصفحك. فلا خادم في الطريق، ومن ثمّ لا شيء يُحاسَب عليه ولا حساب يُنشأ.
ولا يُرفع شيء. أعِد تحميل الصفحة تجدها قد نسيت سلسلة تنسيقك.