تنسيق الوقت
جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 60 من 68.
بمجرد أن يكون لديك كائن time.Time، ستحتاج غالبًا إلى تحويله إلى تنسيق نصي سهل القراءة. تستخدم Go أسلوبًا فريدًا لتنسيق الوقت يختلف عن أساليب لغات البرمجة الأخرى.
بدلًا من استخدام رموز التنسيق مثل %Y-%m-%d، تستخدم Go تاريخًا مرجعيًا كقالب. هذا التاريخ المرجعي هو Mon Jan 2 15:04:05 MST 2006، وهو يمثّل اللحظة المحددة: 2 يناير 2006، الساعة 3:04:05 مساءً بتوقيت الجبال القياسي.
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // الناتج: 2023-10-26الفكرة الأساسية هي أن ترتّب مكوّنات التاريخ المرجعي بالنمط الذي تريده. لتنسيق YYYY-MM-DD، تستخدم "2006-01-02" لأن هذا هو شكل التاريخ المرجعي بهذا النمط. ولتنسيق مختلف مثل Jan 2, 2006، تستخدم "Jan 2, 2006".
يجعل هذا النهج القائم على التخطيط تنسيق الوقت في Go سهل التذكر ومرنًا في الوقت نفسه. وبمجرد أن تتذكر التاريخ المرجعي، يمكنك إنشاء أي تنسيق بمجرد ترتيب مكوّناته وفق النمط الذي تريده.
التحدي
سهلأنشئ نظامًا لعرض التاريخ والوقت بتنسيقات متعددة، يقوم بتنسيق كائنات time.Time باستخدام نظام التخطيط الفريد لتاريخ Go المرجعي. سيختبر هذا التحدي قدرتك على استخدام الطريقة Format مع أنماط تخطيط مختلفة لإنشاء تمثيلات متنوعة للتاريخ والوقت.
ستتلقى مُدخلين:
- سلسلة نصية تحتوي على معلومات التاريخ بالتنسيق
"year:month:day:hour:minute"(مثلًا،"2023:12:25:14:30") - سلسلة نصية تحتوي على طلبات التنسيق مفصولة بفواصل بالتنسيق
"format1,format2,format3"(مثلًا،"iso,american,european,time12,time24")
مهمتك هي:
- تحليل المُدخل الأول بتقسيمه عند النقطتين لاستخراج قيم السنة والشهر واليوم والساعة والدقيقة
- تحويل هذه القيم النصية إلى أعداد صحيحة باستخدام الحزمة
strconv - إنشاء كائن
time.Timeباستخدامtime.Dateمع القيم التي تم تحليلها (استخدمtime.UTCللموقع، و0 للثواني والنانوثواني) - عرض ترويسة التطبيق:
"=== DATE/TIME FORMATTER ===" - عرض الوقت المصدر:
"Source time: [complete_time_object]" - تحليل المُدخل الثاني بتقسيمه عند الفواصل للحصول على طلبات التنسيق
- عرض ترويسة التنسيق:
"Formatted outputs:" - لكل طلب تنسيق، استخدم سلسلة التخطيط المناسبة مع الطريقة
Format:- لـ
"iso": استخدم التخطيط"2006-01-02"واعرض"ISO format: [formatted_result]" - لـ
"american": استخدم التخطيط"01/02/2006"واعرض"American format: [formatted_result]" - لـ
"european": استخدم التخطيط"02/01/2006"واعرض"European format: [formatted_result]" - لـ
"long": استخدم التخطيط"January 2, 2006"واعرض"Long format: [formatted_result]" - لـ
"time12": استخدم التخطيط"3:04 PM"واعرض"12-hour time: [formatted_result]" - لـ
"time24": استخدم التخطيط"15:04"واعرض"24-hour time: [formatted_result]" - لـ
"full": استخدم التخطيط"Monday, January 2, 2006 at 3:04 PM"واعرض"Full format: [formatted_result]" - لـ
"compact": استخدم التخطيط"20060102"واعرض"Compact format: [formatted_result]"
- لـ
- حساب الإحصاءات وعرضها:
"=== FORMATTING SUMMARY ===""Total formats applied: [number_of_format_requests]""Date components: [year]-[month]-[day]""Time components: [hour]:[minute]"
- عرض المعلومات المرجعية:
"=== REFERENCE DATE INFO ===""Go uses reference date: Mon Jan 2 15:04:05 MST 2006""This represents: January 2nd, 2006 at 3:04:05 PM""Layout patterns arrange these components as needed"
- عرض رسالة الإكمال:
"Date formatting completed using Go's layout system"
استخدم الحزمة time لعمليات الوقت، والحزمة strings لتقسيم سلاسل المُدخلات، والحزمة strconv لتحويل السلاسل النصية إلى أعداد صحيحة، والحزمة fmt لإخراج النص بتنسيق محدد. تذكّر أن تنسيق الوقت في Go يستخدم التاريخ المرجعي Mon Jan 2 15:04:05 MST 2006 قالبًا، وأنك ترتب هذه المكونات وفق النمط الذي تريده. يوضح هذا التحدي كيفية عمل نظام التنسيق الفريد القائم على التخطيطات في Go، إذ ستطبق أنماط تنسيق متعددة ومختلفة على كائن الوقت نفسه.
جرّب بنفسك
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// اقرأ المدخلات
var dateInput string
var formatInput string
fmt.Scanln(&dateInput)
fmt.Scanln(&formatInput)
// حلّل مكوّنات التاريخ بتقسيمها عند النقطتين الرأسيتين
dateComponents := strings.Split(dateInput, ":")
// حوّل المكوّنات النصية إلى أعداد صحيحة
year, _ := strconv.Atoi(dateComponents[0])
month, _ := strconv.Atoi(dateComponents[1])
day, _ := strconv.Atoi(dateComponents[2])
hour, _ := strconv.Atoi(dateComponents[3])
minute, _ := strconv.Atoi(dateComponents[4])
// أنشئ كائنًا من النوع time.Time
sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// حلّل طلبات التنسيق
formatRequests := strings.Split(formatInput, ",")
// TODO: اكتب شيفرتك أدناه
// اعرض ترويسة التطبيق
// اعرض الوقت الأصلي
// عالج كل طلب تنسيق واعرض النتائج المنسّقة
// احسب الإحصاءات واعرضها
// اعرض المعلومات المرجعية
// اعرض رسالة الإكمال
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكياتتدرّب بنفسك: مترجم Go عبر الإنترنت