עיצוב זמן
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 60 מתוך 68.
ברגע שיש לך אובייקט time.Time, לעיתים קרובות תצטרך להמיר אותו לפורמט מחרוזת קריא. Go משתמשת בגישה ייחודית לעיצוב זמן, השונה מזו של שפות תכנות אחרות.
במקום להשתמש בקודי עיצוב כמו %Y-%m-%d, Go משתמשת בתאריך ייחוס כתבנית. תאריך הייחוס הזה הוא Mon Jan 2 15:04:05 MST 2006, שמייצג את הרגע המדויק: 2 בינואר 2006, בשעה 3:04:05 אחר הצהריים לפי שעון ההרים הסטנדרטי.
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // פלט: 2023-10-26התובנה המרכזית היא שמסדרים את רכיבי תאריך הייחוס בתבנית הרצויה. עבור תבנית YYYY-MM-DD, משתמשים ב־"2006-01-02", כי כך נראה תאריך הייחוס בתבנית הזאת. עבור תבנית אחרת, כמו Jan 2, 2006, משתמשים ב־"Jan 2, 2006".
הגישה הזו, המבוססת על פריסה, הופכת את עיצוב השעה ב-Go לקל לזכירה וגמיש. ברגע שזוכרים את תאריך הייחוס, אפשר ליצור כל פורמט פשוט על ידי סידור הרכיבים שלו בתבנית הרצויה.
אתגר
קלצרו מערכת להצגת תאריך ושעה במספר פורמטים, שמעצבת אובייקטים מסוג time.Time באמצעות מערכת תבניות התאריך הייחוסי הייחודית של Go. האתגר הזה יבחן את היכולת שלכם להשתמש במתודה Format עם תבניות שונות כדי ליצור מגוון ייצוגים של תאריך ושעה.
תקבלו שתי קלטים:
- מחרוזת המכילה מידע על תאריך בפורמט
"year:month:day:hour:minute"(לדוגמה,"2023:12:25:14:30") - מחרוזת המכילה בקשות עיצוב המופרדות בפסיקים בפורמט
"format1,format2,format3"(לדוגמה,"iso,american,european,time12,time24")
המשימה שלכם היא:
- לנתח את הקלט הראשון באמצעות פיצול לפי נקודתיים כדי לחלץ את ערכי השנה, החודש, היום, השעה והדקה
- להמיר את ערכי המחרוזת האלה למספרים שלמים באמצעות החבילה
strconv - ליצור אובייקט
time.Timeבאמצעותtime.Dateעם הערכים שנותחו (השתמשו ב-time.UTCעבור אזור הזמן, וב-0 עבור השניות והננו־שניות) - להציג את כותרת היישום:
"=== DATE/TIME FORMATTER ===" - להציג את שעת המקור:
"Source time: [complete_time_object]" - לנתח את הקלט השני באמצעות פיצול לפי פסיקים כדי לקבל את בקשות העיצוב
- להציג את כותרת העיצוב:
"Formatted outputs:" - עבור כל בקשת עיצוב, להשתמש במחרוזת התבנית המתאימה עם המתודה
Format:- עבור
"iso": השתמשו בתבנית"2006-01-02"והציגו"ISO format: [formatted_result]" - עבור
"american": השתמשו בתבנית"01/02/2006"והציגו"American format: [formatted_result]" - עבור
"european": השתמשו בתבנית"02/01/2006"והציגו"European format: [formatted_result]" - עבור
"long": השתמשו בתבנית"January 2, 2006"והציגו"Long format: [formatted_result]" - עבור
"time12": השתמשו בתבנית"3:04 PM"והציגו"12-hour time: [formatted_result]" - עבור
"time24": השתמשו בתבנית"15:04"והציגו"24-hour time: [formatted_result]" - עבור
"full": השתמשו בתבנית"Monday, January 2, 2006 at 3:04 PM"והציגו"Full format: [formatted_result]" - עבור
"compact": השתמשו בתבנית"20060102"והציגו"Compact format: [formatted_result]"
- עבור
- לחשב ולהציג נתונים סטטיסטיים:
"=== FORMATTING SUMMARY ===""Total formats applied: [number_of_format_requests]""Date components: [year]-[month]-[day]""Time components: [hour]:[minute]"
- להציג מידע עזר:
"=== REFERENCE DATE INFO ===""Go uses reference date: Mon Jan 2 15:04:05 MST 2006""This represents: January 2nd, 2006 at 3:04:05 PM""Layout patterns arrange these components as needed"
- להציג את הודעת הסיום:
"Date formatting completed using Go's layout system"
השתמשו בחבילה time לפעולות הקשורות לזמן, בחבילה strings לפיצול מחרוזות הקלט, בחבילה strconv להמרת מחרוזות למספרים שלמים, ובחבילה fmt לפלט מעוצב. זכרו שעיצוב הזמן ב-Go משתמש בתאריך הייחוס Mon Jan 2 15:04:05 MST 2006 כתבנית, ושאתם מסדרים את הרכיבים האלה בתבנית הרצויה. האתגר הזה מדגים כיצד פועלת שיטת העיצוב הייחודית של Go, המבוססת על תבניות, בכך שתיישמו כמה תבניות עיצוב שונות על אותו אובייקט זמן.
נסו בעצמכם
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// קרא את הקלט
var dateInput string
var formatInput string
fmt.Scanln(&dateInput)
fmt.Scanln(&formatInput)
// נתח את רכיבי התאריך באמצעות פיצול לפי נקודתיים
dateComponents := strings.Split(dateInput, ":")
// המר רכיבי מחרוזת למספרים שלמים
year, _ := strconv.Atoi(dateComponents[0])
month, _ := strconv.Atoi(dateComponents[1])
day, _ := strconv.Atoi(dateComponents[2])
hour, _ := strconv.Atoi(dateComponents[3])
minute, _ := strconv.Atoi(dateComponents[4])
// צור אובייקט time.Time
sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// נתח את בקשות העיצוב
formatRequests := strings.Split(formatInput, ",")
// TODO: כתוב את הקוד שלך למטה
// הצג את כותרת היישום
// הצג את זמן המקור
// עבד כל בקשת עיצוב והצג את הפלטים המעוצבים
// חשב והצג נתונים סטטיסטיים
// הצג מידע לעיון
// הצג הודעת סיום
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין