إنشاء وقت محدد
جزء من قسم Logic & Flow في رحلة 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) إذا كنت تفضل ذلك. عادةً ما تستخدم معلمة الموقع (location parameter) 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"
استخدم حزمة 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. تحليل كل إدخال حدث لاستخراج name، وyear، وmonth، وday، وhour، وminute
// 2. تذكر التحقق مما إذا كانت شريحة parts تحتوي على عناصر كافية قبل الوصول إليها
// 3. تحويل الأرقام النصية إلى أعداد صحيحة باستخدام strconv.Atoi()
// 4. إنشاء كائنات time.Time باستخدام time.Date() لكل حدث
// 5. عرض ترويسة التطبيق ورسائل التحميل
// 6. معالجة كل خيار عرض (chronological، وdetails، وsummary، وyears)
// 7. عرض رسالة الإكمال
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
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)ملخص - الأشكال والسلوكيات