ساعة Kuroko

ساعة Kuroko

تمرين تعلّمي

مقدمة

الوقت

تُستخدم وحدة Time لعرض التواريخ والأوقات بصيغة يقرأها الإنسان. ورغم أنه من الممكن تقنيًا التعامل مع الأوقات بواسطة Time، فإن هناك حزمًا في مجتمع Elm أكثر ملاءمة لهذه المهمة، مثل justinmimbs/date أو CoderDennis/elm-time-format.

Posix

تُمثَّل الأوقات بالنوع المعتم Posix، الذي يغلّف زمن حقبة يونكس، أي عدد المللي ثانية التي مضت منذ منتصف ليل الأول من يناير 1970 بتوقيت UTC. وPosix قيمة لا لبس فيها ولا تختلف بين المناطق الزمنية، لذا فهي خيار جيد لحفظ الوقت. وفي تطبيق Elm، تُوفَّر أوقات Posix عادةً من مصادر خارجية، مثل المتصفح.

يمكن تحويل Posix إلى عدد من المللي ثانية والعكس باستخدام الدالتين التاليتين:

posixToMillis : Posix -> Int
millisToPosix : Int -> Posix

المناطق الزمنية

في حياتنا اليومية، لا نقرأ نحن البشر Posix عادةً، بل نفضّل التوقيت المحلي، الذي يعتمد على موقعنا على الأرض وقواعد التوقيت الصيفي المحلية. وفي Elm، تُرمَّز هذه المعلومات في النوع المعتم Zone، الذي يوفّره المتصفح عادةً.

وهناك Zone خاص يمكن الوصول إليه دائمًا:

utc : Zone

الأوقات بصيغة يقرأها الإنسان

بوجود Posix وZone، تتوفر لدينا معلومات كافية لعرض التوقيت المحلي بأي مستوى من التفصيل. وفيما يلي قائمة بالدوال التي يمكن استخدامها لذلك:

toYear : Zone -> Posix -> Int
toMonth : Zone -> Posix -> Month
toDay : Zone -> Posix -> Int
toWeekday : Zone -> Posix -> Weekday
toHour : Zone -> Posix -> Int
toMinute : Zone -> Posix -> Int
toSecond : Zone -> Posix -> Int
toMillis : Zone -> Posix -> Int

ستلاحظ نوعين مخصصين آخرين في Time:

type Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
type Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun

ويُترك للمستخدمين تحويل هذين النوعين المخصصين إلى قيم يقرأها الإنسان.

التعليمات

صديقك الياباني كوروكو صانع محتوى بث مباشر يحظى بجمهور دولي. جدول بث كوروكو معقّد إلى حد كبير، فيبدو أن كل بث يبدأ في وقت مختلف كل يوم.

يطلب مساعدتك في بناء تطبيق صغير يعرض جدوله حسب المناطق الزمنية المحلية لمشاهديه: ساعة كوروكو. ولديه مطلب إضافي: يجب أن يستطيع التطبيق عرض الوقت بلغتين مختلفتين: اليابانية والإنجليزية الأمريكية.

1. إنه تاريخ

عرّف دالة showLocalDate : Locale -> Int -> Month -> Int -> String تعرض تاريخًا محليًا (صالحًا).

في الإعداد المحلي US، سيكون التنسيق Month/Day/Year بدون أصفار بادئة.

وفي الإعداد المحلي JP، سيكون التنسيق Year年Month月Day日، أيضًا بدون أصفار بادئة.

showLocalDate US 2025 May 1
    -- "5/1/2025"
showLocalDate JP 2025 May 1
    -- "2025年5月1日"

2. حان وقت العرض

عرّف دالة showLocalTime : Locale -> Int -> Int -> String تعرض وقتًا محليًا (صالحًا).

في الإعداد المحلي US، تُعرض الساعات بنظام 12 ساعة مع "PM" أو "AM"، وتُعرض الدقائق بأصفار بادئة.

وفي الإعداد المحلي JP، تُعرض الساعة بنظام 24 ساعة قبل "時"، وتُعرض الدقائق بدون أصفار بادئة قبل "分".

showLocalTime US 13 8
    -- "1:08 PM"
showLocalTime JP 13 8
    -- "13時8分"

3. ادخل إلى المنطقة الزمنية

عرّف دالة showDateTime : Locale -> Zone -> Posix -> String تعرض تاريخًا ووقتًا نسبةً إلى منطقة زمنية في إعداد محلي محدد.

استخدم showLocalDate وshowLocalTime لعرض النتيجة النهائية.

showDateTime US Time.utc (Time.millisToPosix 0)
    -- "1/1/1970 12:00 AM"
showDateTime JP Time.utc (Time.millisToPosix 0)
    -- "1970年1月1日0時0分"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Elm Exercism

مستعد لبدء ساعة Kuroko؟

سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.