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

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

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

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. تحليل المدخل الأول عن طريق التقسيم عند الفواصل للحصول على إدخالات الأحداث الفردية
  2. لكل إدخال حدث، قم بالتقسيم عند النقطتين الرأسيتين لاستخراج اسم الحدث، والسنة، والشهر، واليوم، والساعة، والدقيقة
  3. تحويل السلاسل الرقمية إلى أعداد صحيحة وإنشاء كائن time.Time باستخدام time.Date لكل حدث (استخدم time.UTC لمعلمة الموقع و 0 للثواني والنانو ثانية)
  4. عرض ترويسة التطبيق: "=== HISTORICAL TIMELINE APPLICATION ==="
  5. عرض تأكيد تحميل الأحداث: "Loading historical events..."
  6. لكل حدث، اعرض: "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_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. تحليل كل إدخال حدث لاستخراج name، وyear، وmonth، وday، وhour، وminute
	// 2. تذكر التحقق مما إذا كانت شريحة parts تحتوي على عناصر كافية قبل الوصول إليها
	// 3. تحويل الأرقام النصية إلى أعداد صحيحة باستخدام strconv.Atoi()
	// 4. إنشاء كائنات time.Time باستخدام time.Date() لكل حدث
	// 5. عرض ترويسة التطبيق ورسائل التحميل
	// 6. معالجة كل خيار عرض (chronological، وdetails، وsummary، وyears)
	// 7. عرض رسالة الإكمال
	
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow