إنشاء وقت محدد
جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 59 من 68.
بينما تمنحك time.Now() اللحظة الحالية، ستحتاج غالبًا إلى العمل مع تواريخ وأوقات محددة. توفر Go الدالة time.Date لإنشاء كائن time.Time يمثّل أي تاريخ ووقت تحدده.
تأخذ الدالة time.Date ثماني معاملات بهذا الترتيب تحديدًا: السنة، والشهر، واليوم، والساعة، والدقيقة، والثانية، والنانوثانية، والموقع. إليك الصياغة الأساسية:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)لاحظ أن Go تستخدم ثوابت مثل time.March للأشهر، مما يجعل الشيفرة أكثر قابلية للقراءة من استخدام الأرقام. يمكنك أيضًا استخدام أعداد صحيحة (1-12) إذا كنت تفضل ذلك. تستخدم معلمة الموقع عادةً time.UTC لتوقيت UTC أو time.Local للمنطقة الزمنية المحلية لنظامك.
يمنحك هذا الأسلوب تحكمًا كاملًا في إنشاء أي لحظة زمنية محددة، سواء أكانت عيد ميلاد أم موعدًا نهائيًا أم تاريخًا تاريخيًا. يعمل كائن 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")
مهمتك هي:
- حلّل المُدخل الأول بتقسيمه عند الفواصل للحصول على مُدخلات الأحداث المنفردة
- لكل مُدخل حدث، قسّمه عند النقطتين الرأسيتين لاستخراج اسم الحدث والسنة والشهر واليوم والساعة والدقيقة
- حوّل السلاسل الرقمية إلى أعداد صحيحة وأنشئ كائن
time.Timeباستخدامtime.Dateلكل حدث (استخدمtime.UTCلمعامل المنطقة، و0 للثواني والنانوثواني) - اعرض ترويسة التطبيق:
"=== HISTORICAL TIMELINE APPLICATION ===" - اعرض تأكيد تحميل الأحداث:
"Loading historical events..." - اعرض لكل حدث:
"Loaded: [event_name] - [complete_time_object]" - حلّل المُدخل الثاني بتقسيمه عند الفواصل للحصول على خيارات العرض
- عالج كل خيار من خيارات العرض:
- لـ
"chronological": اعرض"=== CHRONOLOGICAL ORDER ==="متبوعًا بالأحداث مرتّبة حسب التاريخ (من الأقدم إلى الأحدث)، مع إظهار"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - لـ
"details": اعرض"=== DETAILED INFORMATION ==="متبوعًا بالأسطر التالية لكل حدث (تكون الأسطر الأربعة الأخيرة مزاحة بمقدار مسافتين):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"
قواعد التنسيق: يطبع سطر Loaded: قيمة time.Time كما هي باستخدام %v، مثلًا Loaded: Moon Landing - 1969-07-20 20:17:00 +0000 UTC. تُنسّق جميع التواريخ والأوقات الأخرى يدويًا: لا يُضاف صفر بادئ إلى الشهر واليوم والساعة، بينما تُعرض الدقيقة دائمًا برقمين (%02d)، لذا سيُعرض الحدث نفسه هكذا Moon Landing: 1969-7-20 at 20:17 UTC، وتُعرض الدقيقة 0 هكذا 21:00. تمثل [unix_seconds] القيمة الناتجة عن Unix()، وتكون سالبة للتواريخ السابقة لعام 1970. في قائمة العقود، تُعرض العقود من الأقدم إلى الأحدث، وتُضمّ الأسماء في كل عقد باستخدام فاصلة من دون مسافة، وبترتيب ورودها في المُدخل.
استخدم الحزمة 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. عالج كل خيار عرض (الترتيب الزمني، التفاصيل، الملخص، السنوات)
// 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 عبر الإنترنت