Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

إنشاء وقت محدد

جزء من قسم المنطق وتدفق التنفيذ في رحلة 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()، ويمكن استخدامه مع جميع عمليات الوقت نفسها.

challenge icon

التحدي

سهل

أنشئ تطبيقًا لخط زمني للأحداث التاريخية يستخدم 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")

مهمتك هي:

  1. تحليل المُدخل الأول بتقسيمه عند الفواصل للحصول على إدخالات event الفردية
  2. لكل إدخال event، تقسيمه عند النقطتين لاستخراج اسم event والسنة والشهر واليوم والساعة والدقيقة
  3. تحويل السلاسل الرقمية إلى أعداد صحيحة وإنشاء كائن time.Time باستخدام time.Date لكل event (استخدم time.UTC لمعامل الموقع و0 للثواني والنانوثواني)
  4. عرض ترويسة التطبيق: "=== HISTORICAL TIMELINE APPLICATION ==="
  5. عرض تأكيد تحميل الأحداث: "Loading historical events..."
  6. لكل event، عرض: "Loaded: [event_name] - [complete_time_object]"
  7. تحليل المُدخل الثاني بتقسيمه عند الفواصل للحصول على خيارات العرض
  8. معالجة كل خيار عرض:
    • بالنسبة إلى "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]"
  9. اعرض رسالة الإكمال: "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. اعرض رسالة الإكمال
	
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم Go عبر الإنترنت