Menu
CoddyTech

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

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

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"

قواعد التنسيق: يطبع سطر 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. اعرض رسالة الاكتمال
	
}
quiz iconاختبر نفسك

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

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

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