פרק קודם:
פייתון 15 - רגקסיםמה נלמד
- מדידת זמן, אזורים ועוד…
- על המודול
datetime
- על המודול
time
- איך לחשב תאריכים
- איך להציג זמנים
- איך להתייחס לפערי זמנים בין מקומות שונים בעולם
- על סוגי תזמונים - טיימרים
זמן ואזורי זמן⏳
חישוב זמן היה אתגר במהלך ההיסטוריה, בעיקר בין תיאום הזמן האסטרונומי שניתן לחשב ע”פ השמש והכוכבים לבין הצרכים החברתיים, טכנולוגיים וכלכליים.
בעבר השתמשו רבות בשעוני מים ושעוני שמש שניסו לקבוע את אורך היום, אך השיטה הייתה שונה בין אזורים שונים בעולם.
אך קודם עלינו לשאול את עצמנו - מהו יום?
ההגדרות האלו נגזרות לפי הזמנים האסטרונומיים של מערכת השמש שלנו.
יום - סיבוב כדור הארץ סביב עצמו.
חודש - השלמה של הסיבוב ע”פ הירח.
שנה - סיבוב של כדור הארץ סביב השמש.
לאחר מכן הבינו שספירה כזו איננה מדויקת.
לאחר ההתפתחות התעשייתית, הצורך בקורדינציה מדויקת יותר עלה - למשל לסנכרן תנועת רכבות בין ערים.
ככה הגענו להתפתחות זמן גריניץ.
זמן גריניץ הוא זמן הנמדד באנגליה ובקצרה הוא נקרא GMT
.
הזמן בבסיס הוא GMT+0
ולמשל ישראל הופכת להיות GMT+2
ובקיץ GMT+3
.
רואים שזמן זה דבר מסובך? חכו זה לא הסוף!
שעון נשמע כמו משהו מובן מאליו, אבל שעון הוא כלי מדידת זמן.
וכמו כל כלי מדעי - יש לו סכנה להיות לא מדויק.
כדי ללמוד זמן באופן מדויק להחריד נבנתה שיטה על בסיס זמן אטומי.
וזה גרם ליצירת זמן UTC
- Coordinated Universal Time
.
מכיוון שזמן סיבוב כדור הארץ איננו קבוע, זה הגיע למצב שהזמן האטומי והזמן האסטרונומי אינם מסונכרנים.
בשביל לפתור את זה, פעם בכמה זמן הוסיפו שנייה - למשל ב2016 הייתה הוספה של שנייה ביום אחד.
ב-2022 החליטו לבטל את ההוספות ולהשאיר את הזמן כסדרו בשביל להפסיק לבלבל מערכות מחשב.
ההחלטה תיכנס לתוקף רק ב-2035.
לזמן יש תכונות רבות ונתאר אותן על מנת שנבין את מימוש הזמן במערכות מחשב בצורה מהימנה וטובה!
הידעת?
המעבר לשעון חורף ושעון קיץ יוצר אתגרים טכניים במערכות מחשב, במיוחד במערכות שאינן מעודכנות להתאים אוטומטית את השעה.
מערכות רבות מסתמכות על הגדרת זמן מדויקת לפעולות קריטיות, כך ששינוי פתאומי יכול לגרום לבעיות בסנכרון, בלבול ברישום זמני פעולות ואף השבתות.
כדי למנוע תקלות, מנהלי מערכות נדרשים לוודא שהעדכונים הנכונים מותקנים מראש ושכל תהליך המתוזמן לפי שעה יותאם מראש לשינויי שעון.
מודע ולא מודע
יחידת זמן יכולה להיות מודעת או בלתי מודעת לאזור הזמן שלה.
למשל השעה 18:30
אינה מודעת לאזור הזמן.
אולם אם אומר שעכשיו שש וחצי בישראל, הוספתי את מימד האזור לתיאור היחידה.
תאריך
שעות ודקות יכולות להופיע בפני עצמן או עם תאריך כלשהו.
דוגמאות:18:30
18:30 30/10/2024
נקודה או רצף
זמן יכול להתבסס בתור נקודה בודדת לאורך ציר הזמן.
או לחילופין ניתר לתאר רצף שיש לו התחלה וסוף.
דוגמאות:00:00-23:59
01/10/2024-07/10-2024
אינטרוולים
אינטרוול מתאר רק את ההפרש של זמן מסוים או במילים פשוטות - חיבור או חיסור של יחידות זמן.
דוגמאות:+5days
+2hours
-10minutes
קלנדרים
תיארנו גם זמן שמחושב בעזרת שעונים אסטרונומיים ושעונים אטומיים - אך איך נדע לא רק באיזה יום אנחנו אלה מהי השנה?
כאן נכנסים לתמונה קלנדרים!
שני הלוחות שנה שאנו מכירים זה כמובן הלועזי והעברי.
עוד לוח שנה מעניין הוא היפני - שנותן מימד נוסף הנקרא Era
שהוא בכלל נקבע - ע”פ הקיסר!
מאפיין | לוח שנה לועזי | לוח שנה עברי | לוח שנה יפני |
---|---|---|---|
מבוסס על | שמש | ירח-שמש | שמש, בשילוב שלטון קיסרי |
מספר חודשים בשנה | 12 חודשים | 12 חודשים (13 בשנה מעוברת) | 12 חודשים |
אורך שנה | 365 ימים (366 בשנה מעוברת) | 354 ימים (355-385 בשנה מעוברת) | 365 ימים |
חודשי השנה | ינואר-דצמבר | תשרי-אלול | חודשי הלוח הגרגוריאני |
שנה מעוברת | כל 4 שנים | לפי מחזור בן 19 שנים | תלוי בלוח הגרגוריאני |
תחילת השנה | 1 בינואר | תשרי (סביב ספטמבר-אוקטובר) | 1 בינואר |
שיטת מספור שנים | מונה מהולדת ישו | מונה מבריאת העולם | מתעדכן בכל תקופת שלטון קיסרי |
השנה הנוכחית | 2024 | ה’תשפ”ד (5784) | רֵיוָוה 6 (בהתאם לשלטון הקיסרי) |
epoch
זו הגדרת זמן אוניברסלית המתארת את מספר השניות מאז תאריך מסוים.
התאריך נבחר שרירותית והוא - 01/01/1970
.
epoch לדוגמא:
1731263129
1731261000
1720000000
איך לדעתכם נייצג תאריכים לפני
1970
בעזרתepoch
?
מודול time
חלק זה בעבודה
המודול time
מאפשר לנו לעבוד עם נתוני זמן על מנת לחשב או להציג זמנים בפורמטים שונים.
time - epoch
הפונקציה הבסיסית היא time.time()
.
הפונקציה מחזירה את מספר השניות בפורמט epoch
.
1 | import time |
מכיוון שהזמן הוא בשניות יכול להיות חוסר דיוק קטן.
במידה וחשוב לכם דיוק יותר טוב תשתמשו בפונקציה time.time_ns
.
הפונקציה הזו מחזירה את מספר הננו-שניות מאז ה-epoch
.
- בווינדוס הוא קורא ל-
GetSystemTimeAsFileTime
. - קורא ל-
clock_gettime(CLOCK_REALTIME)
במידה וקיים. - אחרת קורא ל-
gettimeofday()
.
localtime & gmtime
1 | import time |
הזמן הלוקאלי של המחשב בו הסקריפט רץ יוחזר על ידי הפונקציה localtime
.gmtime
מחזיר את זמן ה-UTC
.
מה הפונקציות מחזירות?
נלמד על זה בהרחבה בפרקים הבאים על מחלקות.
ניתן לראות בהם כאוסף של נתונים עם שמות
בשפות שונות ניתן לקרוא לאוסף הזה “מבנה”.
מאפייני המבנה
הפייתון מדפיס משהו שנקרא struct_time
המאסף את המאפיינים של זמן.
1 | > time.localtime() |
tm_year
- שנהtm_mon
- חודשtm_mday
- יום בחודשtm_hour
- שעהtm_min
- דקהtm_sec
- שנייהtm_wday
- מספר ימים אחרי ראשוןtm_yday
- מספר ימים מתחילת השנהtm_isdst
- אם 1 אז שעון קיץtm_zone
- אזור זמןtm_gmtoff
- יחס שניות מזרחית ל-UTC
.
time.localtime - המרה למבנה זמן
ניתן בקלות להמיר שניות למבנה זמן בעזרת העברה של הנתון לפונקציה:
1 | import time |
בצורה הזו ניתן לשמור את הזמן הקודם ואז להמיר אותו במידה ונצטרך.
למה להמיר צורות זמן?
הצגנו בתחילת הפוסט צורות זמן שונות, ולעיתים נרצה להציג את הזמן בצורה שונה למשתמשים שונים.
הזמן המיוצג כ-epoch
הוא נוחש לחישוב כי זה ערך מספרי.
אך אם נרצה לייצג epoch
כתאריך עברי נצטרך ללמוד המרות מורכבות יותר.
בשביל להקל על אלגוריתמים ולדעת לייצג את הזמן בצורה מדויקת נבנה ה-struct_time
.
למשל ב-epoch
לא נדע אם יש הוזזת שעון או לא.
time.mktime - המרה לepoch
באותה קלות שביצענו המרה למבנה נוכל לבצע המרה לערך המספרי:
1 | import time |
time1 - time2
1 | import time |
נלמד קודם משהו חדש - time.sleep(XSeconds)
מאפשר לנו לעצור את התוכנה ו”לישון” לפרק זמן בשניות.
אז בקריאה הזו אנו משעים את התכנית ל-5 שניות.
לאחר מכן נמדוד את הזמן, כיצד נמדוד אותו?
פשוט נחסיר את הזמן הנוכחי המתקבל מ-time.time()
והזמן הקודם ששמרנו בצד previousTime
.
תוצאה:
1 | >>> import time |
האינטרל הוא ההפרש בין הזמן ששמרנו לפני ובין הזמן הנוכחי בשניות.
מודול datetime
חלק זה בעבודה
בפרק הבא נתחיל נושא מורכב שמהווה את מהות התכנות המודרני, תכנות מונחה עצמים!
פייתון 17 - מחלקות חלק א