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) אם מעדיפים. הפרמטר location משתמש בדרך כלל ב-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 אונליין