إنشاء وقت محدد
جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 59 من 68.
بينما تمنحك time.Now() اللحظة الحالية، ستحتاج غالبًا إلى العمل مع تواريخ وأوقات محددة. توفّر Go الدالة time.Date لإنشاء كائن time.Time يمثّل أي تاريخ ووقت تحددهما.
تأخذ الدالة time.Date ثمانية معاملات بالترتيب الدقيق التالي: السنة، الشهر، day، الساعة، الدقيقة، الثانية، النانوثانية، والموقع. إليك الصيغة الأساسية:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)لاحظ أن Go تستخدم ثوابت مثل time.March للأشهر، مما يجعل شفرتك أكثر قابلية للقراءة من استخدام الأرقام. يمكنك أيضًا استخدام أعداد صحيحة (1-12) إذا فضّلت ذلك. تستخدم معلمة الموقع عادةً time.UTC للتوقيت العالمي المنسق أو time.Local للمنطقة الزمنية المحلية لنظامك.
يمنحك هذا الأسلوب تحكمًا كاملًا في إنشاء أي لحظة محددة من الزمن، سواء كانت birthday أو موعدًا نهائيًا أو تاريخًا historical. يعمل كائن time.Time الناتج تمامًا مثل الكائن من time.Now()، ويمكن استخدامه مع جميع عمليات الوقت نفسها.
التحدي
سهلأنشئ تطبيقًا لخط زمني للأحداث التاريخية يستخدم time.Date لتمثيل تواريخ وأوقات محددة من التاريخ. سيختبر هذا التحدي قدرتك على إنشاء كائنات time.Time للحظات تاريخية دقيقة وعرضها بتنسيق منظم.
ستتلقى مُدخلين:
- سلسلة تحتوي على أحداث تاريخية بالتنسيق
"event1:year:month:day:hour:minute,event2:year:month:day:hour:minute"(مثلًا:"Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0") - سلسلة تحتوي على خيارات العرض مفصولة بفواصل بالتنسيق
"option1,option2,option3"(مثلًا:"chronological,details,summary")
مهمتك هي:
- تحليل المُدخل الأول بتقسيمه عند الفواصل للحصول على إدخالات event الفردية
- لكل إدخال event، تقسيمه عند النقطتين لاستخراج اسم event والسنة والشهر واليوم والساعة والدقيقة
- تحويل السلاسل الرقمية إلى أعداد صحيحة وإنشاء كائن
time.Timeباستخدامtime.Dateلكل event (استخدمtime.UTCلمعامل الموقع و0 للثواني والنانوثواني) - عرض ترويسة التطبيق:
"=== HISTORICAL TIMELINE APPLICATION ===" - عرض تأكيد تحميل الأحداث:
"Loading historical events..." - لكل event، عرض:
"Loaded: [event_name] - [complete_time_object]" - تحليل المُدخل الثاني بتقسيمه عند الفواصل للحصول على خيارات العرض
- معالجة كل خيار عرض:
- بالنسبة إلى
"chronological": اعرض"=== CHRONOLOGICAL ORDER ==="متبوعًا بالأحداث المرتبة حسب التاريخ (من الأقدم إلى الأحدث)، مع إظهار"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - بالنسبة إلى
"details": اعرض"=== DETAILED INFORMATION ==="متبوعًا بكل event، مع إظهار:"Event: [event_name]"" Date: [year]-[month]-[day]"" Time: [hour]:[minute] UTC"" Weekday: [weekday_name]"" Unix timestamp: [unix_seconds]"
- بالنسبة إلى
"summary": اعرض"=== TIMELINE SUMMARY ==="متبوعًا بما يلي:"Total events: [number_of_events]""Earliest event: [earliest_event_name] ([year])""Latest event: [latest_event_name] ([year])""Time span: [years_between_earliest_and_latest] years"
- بالنسبة إلى
"years": اعرض"=== EVENTS BY DECADE ==="متبوعًا بالأحداث مجمعة حسب العقد، مع إظهار"[decade]s: [comma_separated_event_names]" - اعرض رسالة الإكمال:
"Historical timeline processing completed"
استخدم الحزمة time لإنشاء تواريخ محددة باستخدام time.Date، والحزمة strings لتقسيم سلاسل الإدخال، والحزمة strconv لتحويل الأرقام النصية إلى أعداد صحيحة، والحزمة fmt لإخراج منسق. تذكّر أن time.Date تأخذ المعاملات بالترتيب الدقيق التالي: السنة، الشهر، اليوم، الساعة، الدقيقة، الثانية، النانوثانية، الموقع. للفرز زمنيًا، يمكنك مقارنة كائنات time.Time باستخدام الطريقة Before(). يوضّح هذا التحدي كيفية إنشاء لحظات زمنية محددة والعمل مع البيانات التاريخية باستخدام وظائف الوقت في Go.
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// اقرأ الإدخال باستخدام bufio.Scanner للتعامل مع المسافات بشكل صحيح
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
eventsInput := scanner.Text()
scanner.Scan()
optionsInput := scanner.Text()
// حلّل الأحداث من الإدخال
eventEntries := strings.Split(eventsInput, ",")
// حلّل خيارات العرض من الإدخال
displayOptions := strings.Split(optionsInput, ",")
// TODO: اكتب الكود الخاص بك أدناه
// 1. حلّل كل إدخال حدث لاستخراج الاسم والسنة والشهر واليوم والساعة والدقيقة
// 2. تذكّر التحقق مما إذا كانت شريحة parts تحتوي على عناصر كافية قبل الوصول إليها
// 3. حوّل أرقام السلاسل النصية إلى أعداد صحيحة باستخدام strconv.Atoi()
// 4. أنشئ كائنات time.Time باستخدام time.Date() لكل حدث
// 5. اعرض رأس التطبيق ورسائل التحميل
// 6. Process each display option (chronological, details, summary, years)
// 7. اعرض رسالة الإكمال
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
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 عبر الإنترنت