ar
Feedback
ToCode

ToCode

الذهاب إلى القناة على Telegram

טיפים קצרים למתכנתים מאת ינון פרק

إظهار المزيد
1 420
المشتركون
لا توجد بيانات24 ساعات
+37 أيام
-430 أيام
أرشيف المشاركات
ToCode
1 420
# זה רק קוד קחו את הקוד הכי יפה, שימו אותו בארון ותחזרו עוד 5 שנים. הוא עדיין יישאר יפה? הוא עדיין יעבוד? יהיה עדיין מי שירצה לתחזק אותו? לא בטוח בכלל. אנחנו משתמשים בקוד כדי לגרום למחשב לעשות דברים ושוכחים שמחשבים משתנים, הדברים שאנחנו צריכים משתנים ואנחנו משתנים - ולכן גם הקוד צריך להשתנות. רוב הזמן אם אף אחד לא נגע בקוד 5 שנים זה לא אומר שהקוד טוב במיוחד אלא בדיוק להיפך, הקוד כל כך גרוע שלאף אחד אין אומץ לגעת בו. כן הוא פותר את הבעיה אבל הוא מפסיד בתחזוקה. כשאנחנו אומרים ש"קוד זה רק קוד" המשמעות היא- 1. לא נקשרנו לקוד שכתבנו. אנחנו נשמח לבנות מחדש מנגנונים כולל מנגנוני ליבה של המערכת אם בניה מחדש כזאת תשפר את עבודה המערכת. 2. בנינו מראש מנגנונים שיאפשרו לשנות את הקוד כשנצטרך. הקוד לא "מתעד את עצמו" אלא יש הערות במקום שמסבירות מה המטרה של הקוד ומה הפונקציות צריכות לעשות. יצרנו תוכניות בדיקה כדי שאפשר יהיה לשנות חלקים בקוד ולוודא שלא שברנו כלום. 3. בנינו מראש את התקשורת לתוך הקוד במהלך העבודה. עבדנו ב Pair Programming כדי לוודא שלפחות עוד בן אדם אחד יכול לקרוא את מה שכתבנו. הצגנו את הבעיות והפיתרונות המרכזיים של הקוד בפורום של הצוות. קיבלנו פידבק מאנשים שלא קשורים למנגנונים הספציפיים עליהם אנחנו עובדים כדי לוודא שכולם יכולים לקרוא אותם ולדבר עליהם. 4. הקפדנו להשתמש בשפה מנותקת לגבי הקוד. זה לא ה"קוד שלי" או "המנוע של בר", זה "ממשק המשתמש", ה"מנוע" או "ה API". ככל שנקפיד להוציא את הכותבים מהקוד ולהפוך אותו לתוצאת עבודה משותפת של כל הצוות כך יהיה קל יותר לשתף אחריות, אשמה וגם לשכתב כשצריך. זה רק קוד. בואו לא ניתן לו להחליף את התקשורת והעבודה המשותפת שלנו.

ToCode
1 420
# שני הכללים של Generators בפייתון לפייתון לא אכפת איזה Generators נרצה לכתוב, אבל יש שני כללים שכשאנחנו חורגים מהם כדאי לחשוב שנית אם Generator הוא הפיתרון הנכון- 1. גנרטור לא מחשב את כל הערכים מראש. 2. גנרטור לא תופס יותר זיכרון ככל שמחשבים יותר פריטים. האינטואיציה של הכלל הראשון היא שאם גנרטור צריך לחשב את כל הערכים מראש עדיף להחזיר את כל מה שהוא חישב בתור רשימה (או כל מבנה נתונים אחר) ולא צריך לעשות yield כל פעם לאיבר הבא. האינטואיציה של הכלל השני היא שאנשים שמשתמשים בלולאת for עם גנרטור לא מצפים שצריכת הזיכרון תעלה ככל שמושכים יותר איברים, ובמקום אנחנו חושבים שכל פריט בו אנחנו מטפלים משוחרר מהזיכרון באיטרציה הבאה של הלולאה. ועם הכללים האלה אפשר לראות כמה Generators שעדיף היה לכתוב אותם בתור פונקציות רגילות. דוגמה ראשונה היא groupby, שבניגוד לזו מ itertools מחזירה את כל הקבוצות עם כל הפריטים בכל קבוצה:
def groupby(sequence, key):
    groups = defaultdict(list)
    for item in sequence:
        groups[key(item)].append(item)
    
    for key, values in groups.items():
        yield key, values
הפונקציה אומנם קוראת ל yield ונראית כמו Generator, אבל היא חישבה מראש כבר את כל הערכים בסידרה ושומרת הכל בזיכרון. עדיף יהיה להחזיר את groups במקום להחזיר אותם אחד אחד. הכלל השני קצת יותר עדין אבל אני חושב שגם פה האינטואיציה ברורה והבעיה היא שקשה לראות את צריכה הזיכרון העולה בתוך קוד שמשתמש בגנרטור. דוגמה:
import time
import random

def uniq(seq):
    seen = set()
    for i in seq:
        if i not in seen:
            yield i
            seen.add(i)

def random_numbers():
    while True:
        yield random.randint(1, 100)

for i in uniq(random_numbers()):
    time.sleep(2)
    print(i)
אם נדלג בעין על הגדרת הפונקציה uniq, אפשר לפספס את תוספת הזיכרון שתגרום לתוכנית בסוף להתרסק. כשאני מוותר על הגנרטור ומעביר את הקוד פנימה ללולאה התוצאה לדעתי יותר ברורה:
import time
import random

def random_numbers():
    while True:
        yield random.randint(1, 100)

seen = set()
for i in random_numbers():
    if i not in seen:
        time.sleep(2)
        print(i)
        seen.add(i)

ToCode
1 420
# איך להפעיל בקלות פונקציית C מתוך פייתון המודול ctypes מאפשר הפעלה קלה של קוד C מתוך תוכנית פייתון, ונועד בדיוק למקרים בהם יש לכם כבר ספריה עובדת ב C ואתם רוצים לעטוף אותה בממשק נוח יותר למתכנתי פייתון בצוות או לשלב אותה בפרויקט. מאחר ו ctypes הוא מודול מובנה בפייתון, השילוב אפילו לא יוסיף לכם תלויות לפרויקט. קוד? בטח. התוכנית הבאה טוענת את libc ומפעילה את הפונקציה rand מתוכה:
from ctypes import *
from ctypes.util import find_library

libc_location = find_library('c')
libc = cdll.LoadLibrary(libc_location)

print(libc.rand())
פשוט לא? בשביל להעביר פרמטרים לתוכנית C יש לנו 3 סוגי משתנים מובנים ב ctypes שאפשר להעביר כמו שהם: 1. האוביקט None יהפוך ל NULL ב C 2. אוביקט Bytes יהפוך ל const chat * ב C 3. מספר int יהפוך ל int ב C. לכן בשביל להפעיל את הפונקציה mkdir וליצור תיקייה חדשה מתוך קוד C אני יכול לכתוב:
from ctypes import *
from ctypes.util import find_library

libc_location = find_library('c')
libc = cdll.LoadLibrary(libc_location)

libc.mkdir(b"newdir")
בשביל העברת פרמטרים יותר מתוחכמים אנחנו צריכים להגדיר את טיפוסי הנתונים של הפונקציות ב C. זו אגב נקודת התורפה של ספריית ctypes, שמקבלת מענה רק בספריה אחרת בשם cffi, אבל זה כבר סיפור לפוסט אחר. בינתיים בכל מקרה ובתוך ctypes הדרך להפעיל פונקציות שצריכות פרמטרים יותר מתוחכמים היא להגדיר את טיפוסי הנתונים של אותן פונקציות. לדוגמה הפונקציה pow של libm מקבלת שני double-ים ומחזירה double ולכן בשביל להפעיל אותה אני כותב:
from ctypes import *
from ctypes.util import find_library

libm = cdll.LoadLibrary(find_library('m'))

# Works - use c_double, returns c_double
libm.pow.restype = c_double
libm.pow.argtypes = [c_double, c_double]
print(libm.pow(c_double(2), c_double(3)))
ואפשר כמובן להגדיר גם מבני נתונים מסובכים יותר כמו struct-ים ופונקציות, לדוגמה בפוסט כאן הראיתי איך להעביר פונקציית Callback מפייתון לפונקציית C בעזרת ספריית ctypes. סך הכל ctypes מספקת פיתרון מאוד נוח כשאנחנו צריכים לגשת לספריה מקומפלת קיימת מתוך קוד פייתון. ככל שהספריה תהיה יותר גדולה והממשק יותר מתוחכם, אולי נרצה להוסיף פיתרון כמו cffi שיודע לקרוא הגדרות של פונקציות בשפת C ולתרגם אותן אוטומטית לפייתון, וכך לחסוך לעצמנו את ההגדרה הכפולה.

ToCode
1 420
# טייפסקריפט ללא טייפסקריפט: קריאת JSDoc אתמול כתבתי על הפרידה של DHH מטייפסקריפט וראינו איך "יותר מדי טייפסקריפט" יכול להזיק. מעניין לשים לב שטייפסקריפט היא בעצם שפה גמישה להפליא, ואפשר להשתמש בה כמעט בלי להרגיש - כשהרעיון שבמקום להשתמש בטייפסקריפט כשפה נשתמש רק ביכולת לבדוק טיפוסים. בואו נלך לשחק עם זה בעזרת סטנדרט לכתיבת הערות בשם JSDoc. ## מה זה JSDoc לפני 24 שנים החברים בנטסקייפ חשבו שצריך להוסיף תיעוד מסודר יותר ל JavaScript והחליטו על המונח JSDoc, נגזרת או משחק על JavaDoc, כדי לתאר סטנדרט של כתיבת הערות על קוד שיכללו בין השאר מידע על טיפוסים שפונקציות מצפות לקבל ולהחזיר. שיטת העבודה של JSDoc היא להוסיף תוויות מיוחדות להערות וכל תווית אומרת משהו על הפונקציה או על הקובץ, לדוגמה תווית @author אומרת מי כתב את הקובץ, תווית @param מתעדת פרמטר לפונקציה ותווית @returns מתעדת את ערך ההחזר של הפונקציה. ## איך JSDoc קשור לטייפסקריפט? כשטייפסקריפט נכתבה JSDoc כבר היתה סטנדרט קיים ובשביל שיהיה לכולם קל לשלב את טייפסקריפט מייקרוסופט כללה תמיכה ב JSDoc בתוך הקומפיילר של טייפסקריפט. זה אומר שטייפסקריפט יכולה לקרוא קובץ JavaScript המכיל מידע על טיפוסים בפורמט JSDoc ולהשתמש במידע זה. מאחר וטייפסקריפט משולבת ב VSCode אני יכול מתוך סביבת הפיתוח אפילו בקבצי JavaScript לקבל הערות על טיפוסים בלי להוסיף שום מידע חדש או ספציפי לטייפסקריפט. אפשר למצוא את הפרטים על TypeScript ו JSDoc בתיעוד כאן: https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html ## הדגמה: פונקציה שמקבלת מספר בואו נראה קצת קוד. הפונקציה הבאה מקבלת מספר ומכפילה אותו ב-2 אבל אנחנו לא יודעים את זה וגם המחשב לא יכול לדעת:
function twice(x) {
  return x * 2;
}
דרך קלה לספר למחשב (ולאנשים) שהפונקציה צריכה לקבל מספר ולהחזיר מספר היא JSDoc. אני מוסיף את ההערה:
/**
 * Doubles the given number
 * @param {number} x an input number
 * @returns {number} x * 2
 */
function twice(x) {
  return x * 2;
}
נוסיף לפרויקט גם קובץ בשם tsconfig.json. למרות השם, אני לא מתקין TypeScript ולא מוסיף דרישה לקומפילציה. כל הקוד שאני כותב יכול להיטען כמו שהוא בדפדפן. תוכן הקובץ יהיה:
{
  "compilerOptions": {
    "allowJs": true,
    "checkJs": true
  }
}
אבל זה כל מה ש VS Code היה צריך בשביל לבדוק את תקינות הטיפוסים של הקוד בעזרת הערות ה JSDoc שרשמתי. עכשיו הקוד הבא מציג פס אדום ב VS Code מתחת לטקסט a בהפעלת הפונקציה:
/**
 * Doubles the given number
 * @param {number} x an input number
 * @returns {number} x * 2
 */
function twice(x) {
  return x * 2;
}

// show a red line under the 'a'
console.log(twice('a'));
## הדגמה: פונקציה שמקבלת אלמנט HTML בואו ננסה אחד יותר מסובך וגם פה אין שום בעיה. שימו לב לקוד הבא:
/**
 * 
 * @param {HTMLElement} element 
 * @param {{text?: string, backgroundColor?: string}} textAndStyle 
 */
function addTextAndStyle(element, textAndStyle) {
  if (textAndStyle.text) {
    element.textContent = textAndStyle.text;
  }
  if (textAndStyle.backgroundColor) {
    element.style.backgroundColor = textAndStyle.backgroundColor;
  }
}

addTextAndStyle(document.querySelector('#app'), { text: 'hello world'});
הפונקציה מקבלת שני פרמטרים, הראשון הוא אוביקט מסוג HTMLElement והשני הוא אוביקט שאולי מכיל מפתח בשם text ואולי מכיל מפתח בשם backgroundColor. ## טיפ לאנשים שרוצים לשלב טייפסקריפט לאט הבחירה בכתיבת טיפוסים ב JSDoc ובדיקתם בתוך עורך הטקסט היא בחירה הרבה יותר קלה מכניסה בכל הכח לעולם של טייפסקריפט. אתם לא צריכים ללמוד תחביר חדש ואם אתם לא בטוחים מה לכתוב בפרמטר תמיד אפשר להשתמש בכוכבית. אפילו במקרה הגרוע שעשיתם טעות בטיפוסים, הקוד עדיין ירוץ בדפדפן בלי בעיה. כתיב כזה יכול לעזור להרגיל את חברי הצוות לאט להשתמש בכתיב הטיפוסים, כדי שכשיגיע הרגע לכתוב טייפסקריפט תהיה לכם את התשתית במקום והמוכנות ללמוד כלים חדשים שיעזרו להתמודד עם כפילויות בהגדרת הטיפוסים.

ToCode
1 420
אישית גם אחרי קריאה של ה PR לא השתכנעתי שההחלטה לוותר על טייפסקריפט היתה נכונה. ברור שזה יחסוך קצת זמן פיתוח, אבל העלות בריפקטורינג מסובך יותר תהיה מורגשת ובלי Type Hints יהיה יותר קשה למפתחים מחוץ לפרויקט לתרום ולהרגיש בבית. ועדיין אי אפשר להגיד שלטייפסקריפט אין עלות או שזו רק מערכים טיפוסים שלא משנה את האופי של הקוד. מה דעתכם? יש פה קוראים שניסו ללכת לטייפסקריפט וכמו DHH מתחרטים וחזרו אחורה? אם כן אשמח לשמוע בתגובות מה בדיוק קרה.

ToCode
1 420
# למה שמישהו ירצה להיפרד מטייפסקריפט? הויכוח ברוב הרשתות בימים האחרונים סביב ההודעה של DHH על פרידה מטייפסקריפט בפרויקט Turbo8 הציג את הסיפור בתור בחירה פשוטה בין "כתיבת קוד מהיר" ל"כתיבת קוד איכותי", והיה מאוד מפתה לשים את DHH במשבצת ה"כתיבת קוד מהיר". אבל לפני שארגיש בנוח עם החלוקה הזאת, יהיה מעניין להיכנס ל PR הרלוונטי ולראות מה זה בעצם אומר להיפרד מ TypeScript ולמה DHH היה כל כך נחוש. כאן אפשר למצוא את כל הקבצים שהשתנו: https://github.com/hotwired/turbo/pull/971/files. בואו ננסה למצוא כמה מוקדים מעניינים- ## טייפסקריפט הוסיף סמנטיקה לשפה בקובץ form_submission.ts אני מוצא את הבלוק:
export type FormSubmissionResult = { success: boolean; fetchResponse: FetchResponse } | { success: false; error: Error }

export enum FormSubmissionState {
  initialized,
  requesting,
  waiting,
  receiving,
  stopping,
  stopped,
}

enum FormEnctype {
  urlEncoded = "application/x-www-form-urlencoded",
  multipart = "multipart/form-data",
  plain = "text/plain",
}
שב JavaScript הופך ל:
export const FormSubmissionState = {
  initialized: "initialized",
  requesting: "requesting",
  waiting: "waiting",
  receiving: "receiving",
  stopping: "stopping",
  stopped: "stopped"
}
מתכנתי JavaScript שצריכים לתחזק את הקוד עשויים להיתקל במילים חדשות כמו enum ולתהות בשביל מה צריך את זה. הבטחתם לנו "רק" מערכת טיפוסים, וקיבלנו מילים חדשות עם משמעות חדשה שעכשיו צריך להכיר. דוגמה נוספת מהקובץ cache.ts היא הבלוק הזה:
resetCacheControl() {
    this.setCacheControl("")
  }

  exemptPageFromCache() {
    this.setCacheControl("no-cache")
  }

  exemptPageFromPreview() {
    this.setCacheControl("no-preview")
  }

  private setCacheControl(value: string) {
    setMetaContent("turbo-cache-control", value)
  }
}
שהופך ב JavaScript ל:
 resetCacheControl() {
    this.#setCacheControl("")
  }

  exemptPageFromCache() {
    this.#setCacheControl("no-cache")
  }

  exemptPageFromPreview() {
    this.#setCacheControl("no-preview")
  }

  #setCacheControl(value) {
    setMetaContent("turbo-cache-control", value)
  }
}
ושוב אנחנו לוקחים יכולת שכבר קיימת ב JavaScript, משנים לה את התחביר והסמנטיקה ובונים משהו שמתכנתי JavaScript אולי יצטרכו לעבוד בשביל להבין. ## לשמח את טייפסקריפט בקובץ form_submission.ts אני מוצא את הבלוק:
  get stringFormData() {
    return [...this.formData].reduce((entries, [name, value]) => {
      return entries.concat(typeof value == "string" ? [[name, value]] : [])
    }, [] as [string, string][])
  }
שורת ה as בסוף הבלוק נמצאת שם רק בשביל לשמח את טייפסקריפט. היא לא מוסיפה ערך למתכנתים ובטח שלא למתכנתים שיצטרכו להשתמש בספריה. אפילו טייפסקריפט יודע שאם היינו מוסיפים שם ts-ignore במקום ה as הכל היה פשוט עובד. הצורך להוסיף מבנים מיוחדים כמו as לקוד רק בשביל לשמח קומפיילר יכול להיות בעייתי כשרוב המתכנתים בפרויקט הם אנשי JavaScript. ## טיפוסים לפעמים מסתירים טעויות בקוד שימו לב לאחת ההערות מאותו PR: > This one is interesting. I would have no idea what a "submitter's" purpose is here with or without Typescript. > I am excited to see how this code base changes without Typescript. The "types" or what things are will have to be communicated in some way. This may lead to very readable code. ברגע שהם התחילו למחוק טיפוסים חתימות מסוימות נראו ממש לא הגיוניות. מפה הדיון עבר לשאלה איך לתקשר את המשמעות של החתימה ולרעיון שאולי צריך לארגן אחרת את הקוד כדי שהוא יהיה הגיוני. זה לא קרה ב PR הזה אבל יש פה התחלה של דיון שאולי הטיפוסים הסתירו. כשמורידים את הטיפוסים אנחנו מרגישים יותר מחויבים להוסיף תיעוד ובדיקות כדי לתקשר את המשמעות של הקוד.

ToCode
1 420
# חדש ב Node.JS - תמיכה מובנית בקבצי env במסגרת הפינוקים הלא נחוצים של node.js, גירסה 20.6 הוסיפה תמיכה בקבצי env. מצד אחד זה אחלה כי אם יש לנו כבר קבצי env שאנחנו טוענים אותם מתוך דוקר או סביבת הרצה אחרת, נוכל עכשיו יותר בקלות לטעון אותם גם בלי סביבת הדוקר. מצד שני גם בלי תמיכה זו אפשר היה לטעון קבצי env בצורה פשוטה דרך שורת הפקודה. בקיצור בואו נראה על מה מדובר- ## מה זה קובץ env קובץ .env הוא קובץ שכולל רשימה של משתני סביבה וערכים שלהם. בדרך כלל לא נשים אותו במאגר הגיט של הפרויקט אלא ניצור את הקובץ על המכונה שמריצה את הפרויקט. כל מכונה תקבל קובץ env שלה והמשתנים שכתובים בו יגרמו לתוכנה לעבוד לפי הסביבה של המכונה. לדוגמה על סביבת פרודקשן יהיה קובץ .env שיגדיר מפתח API מסוים וסיסמה מסוימת לבסיס נתונים, ועל מכונת פיתוח יהיה קובץ .env עם הגדרות אחרות. מבנה פשוט של קובץ .env הוא:
API_KEY=secret-key-from-env-file
DB_HOST=db
DB_PASSWORD=kinkly-impack-worst-outray
## איך לטעון אותו לפני הרצת כל תוכנית אם יש לי קובץ env בפרויקט ואני רוצה לטעון אותו לפני הרצת תוכנית מתוך שורת הפקודה, הדרך הכי קלה היא לייצא את כל משתני הסביבה עם export ואז להפעיל את התוכנית, כלומר משהו כזה:
$ source <(cat .env| sed 's/^/export /')
זה כמובן לא מושלם כי שטויות שכותבים בקובץ עשויות לרוץ כמו קוד רגיל ואין התעלמות משורות שמתחילות בסולמית. למשל השורה הבאה בקובץ env תיצור קובץ חדש אם ננסה להריץ אותו בשיטה שראינו:
NAME=ynon && touch newfile
## איך לטעון אותו עם התמיכה החדשה של node.js בחזרה ל node.js. גירסה 20.6 שלו כוללת תמיכה מובנית בקבצי env ועכשיו אפשר פשוט להריץ את התוכנית עם המתג --env-file:
$ node --env-file .env a.js
מה שעוד נחמד זה שאפשר להשתמש כמה פעמים במתג כדי לטעון משתני סביבה מכמה קבצי env:
$ node --env-file .env.development --env-file .env a.js
וכך לכתוב את משתני הסביבה המשותפים לכל הסביבות בקובץ .env משותף ואת המשתנים הייחודיים לכל סביבה לשמור בקובץ env שמתאים לסביבה שלו.

ToCode
1 420
ואנחנו רואים שב 2023 מזיזים את השעון פעמיים, פעם אחת ב 24/3 זה היה המעבר לשעון קיץ, ופעם שניה תהיה ב 29/10 כשנעבור לשעון חורף.

ToCode
1 420
Israel  Sat Oct 30 22:59:59 2032 UTC = Sun Oct 31 01:59:59 2032 IDT isdst=1
Israel  Sat Oct 30 23:00:00 2032 UTC = Sun Oct 31 01:00:00 2032 IST isdst=0
Israel  Thu Mar 24 23:59:59 2033 UTC = Fri Mar 25 01:59:59 2033 IST isdst=0
Israel  Fri Mar 25 00:00:00 2033 UTC = Fri Mar 25 03:00:00 2033 IDT isdst=1
Israel  Sat Oct 29 22:59:59 2033 UTC = Sun Oct 30 01:59:59 2033 IDT isdst=1
Israel  Sat Oct 29 23:00:00 2033 UTC = Sun Oct 30 01:00:00 2033 IST isdst=0
Israel  Thu Mar 23 23:59:59 2034 UTC = Fri Mar 24 01:59:59 2034 IST isdst=0
Israel  Fri Mar 24 00:00:00 2034 UTC = Fri Mar 24 03:00:00 2034 IDT isdst=1
Israel  Sat Oct 28 22:59:59 2034 UTC = Sun Oct 29 01:59:59 2034 IDT isdst=1
Israel  Sat Oct 28 23:00:00 2034 UTC = Sun Oct 29 01:00:00 2034 IST isdst=0
Israel  Thu Mar 22 23:59:59 2035 UTC = Fri Mar 23 01:59:59 2035 IST isdst=0
Israel  Fri Mar 23 00:00:00 2035 UTC = Fri Mar 23 03:00:00 2035 IDT isdst=1
Israel  Sat Oct 27 22:59:59 2035 UTC = Sun Oct 28 01:59:59 2035 IDT isdst=1
Israel  Sat Oct 27 23:00:00 2035 UTC = Sun Oct 28 01:00:00 2035 IST isdst=0
Israel  Thu Mar 27 23:59:59 2036 UTC = Fri Mar 28 01:59:59 2036 IST isdst=0
Israel  Fri Mar 28 00:00:00 2036 UTC = Fri Mar 28 03:00:00 2036 IDT isdst=1
Israel  Sat Oct 25 22:59:59 2036 UTC = Sun Oct 26 01:59:59 2036 IDT isdst=1
Israel  Sat Oct 25 23:00:00 2036 UTC = Sun Oct 26 01:00:00 2036 IST isdst=0
Israel  Thu Mar 26 23:59:59 2037 UTC = Fri Mar 27 01:59:59 2037 IST isdst=0
Israel  Fri Mar 27 00:00:00 2037 UTC = Fri Mar 27 03:00:00 2037 IDT isdst=1
Israel  Sat Oct 24 22:59:59 2037 UTC = Sun Oct 25 01:59:59 2037 IDT isdst=1
Israel  Sat Oct 24 23:00:00 2037 UTC = Sun Oct 25 01:00:00 2037 IST isdst=0
Israel  Mon Jan 18 03:14:07 2038 UTC = Mon Jan 18 05:14:07 2038 IST isdst=0
Israel  Tue Jan 19 03:14:07 2038 UTC = Tue Jan 19 05:14:07 2038 IST isdst=0
או בהשוואה למקומות שכבר לא מזיזים את השעון:
$ zdump -v  /usr/share/zoneinfo/America/Bogota

/usr/share/zoneinfo/America/Bogota  Fri Dec 13 20:45:52 1901 UTC = Fri Dec 13 15:49:36 1901 BMT isdst=0
/usr/share/zoneinfo/America/Bogota  Sat Dec 14 20:45:52 1901 UTC = Sat Dec 14 15:49:36 1901 BMT isdst=0
/usr/share/zoneinfo/America/Bogota  Mon Nov 23 04:56:15 1914 UTC = Sun Nov 22 23:59:59 1914 BMT isdst=0
/usr/share/zoneinfo/America/Bogota  Mon Nov 23 04:56:16 1914 UTC = Sun Nov 22 23:56:16 1914 -05 isdst=0
/usr/share/zoneinfo/America/Bogota  Sun May  3 04:59:59 1992 UTC = Sat May  2 23:59:59 1992 -05 isdst=0
/usr/share/zoneinfo/America/Bogota  Sun May  3 05:00:00 1992 UTC = Sun May  3 01:00:00 1992 -04 isdst=1
/usr/share/zoneinfo/America/Bogota  Sun Feb  7 03:59:59 1993 UTC = Sat Feb  6 23:59:59 1993 -04 isdst=1
/usr/share/zoneinfo/America/Bogota  Sun Feb  7 04:00:00 1993 UTC = Sat Feb  6 23:00:00 1993 -05 isdst=0
/usr/share/zoneinfo/America/Bogota  Mon Jan 18 03:14:07 2038 UTC = Sun Jan 17 22:14:07 2038 -05 isdst=0
/usr/share/zoneinfo/America/Bogota  Tue Jan 19 03:14:07 2038 UTC = Mon Jan 18 22:14:07 2038 -05 isdst=0
אז עכשיו שאנחנו מבינים את בסיס הנתונים של אזורי הזמן בואו נסכם בכמה טריקים שיכולים לעזור לנו כשמדברים עם אנשים מכל העולם. הטריק הראשון הוא שבשביל לראות את השעה במקום מסוים אפשר להשתמש ב zdump:
$ zdump  /usr/share/zoneinfo/America/Bogota
/usr/share/zoneinfo/America/Bogota  Fri Sep  8 06:22:09 2023 -05
ואפשר גם להשתמש רק בשם של אזור הזמן בלי הנתיב המלא:
$ zdump  America/Bogota
America/Bogota  Fri Sep  8 06:22:28 2023 -05
ואפילו אם אין לכם את zdump על המחשב תוכלו להשתמש ב date ולהעביר את אזור הזמן בתור משתנה סביבה:
$ TZ=America/Bogota date
Fri Sep  8 06:23:15 -05 2023
הטריק השני הוא שבשביל לזהות מתי פעם הבאה צריך להזיז את השעון כל מה שצריך זה לחפש שורות בקובץ אזור הזמן:
zdump -v Israel| grep 2023|grep isdst=1
Israel  Fri Mar 24 00:00:00 2023 UTC = Fri Mar 24 03:00:00 2023 IDT isdst=1
Israel  Sat Oct 28 22:59:59 2023 UTC = Sun Oct 29 01:59:59 2023 IDT isdst=1

ToCode
1 420
Israel  Sat Oct 26 22:59:59 2019 UTC = Sun Oct 27 01:59:59 2019 IDT isdst=1
Israel  Sat Oct 26 23:00:00 2019 UTC = Sun Oct 27 01:00:00 2019 IST isdst=0
Israel  Thu Mar 26 23:59:59 2020 UTC = Fri Mar 27 01:59:59 2020 IST isdst=0
Israel  Fri Mar 27 00:00:00 2020 UTC = Fri Mar 27 03:00:00 2020 IDT isdst=1
Israel  Sat Oct 24 22:59:59 2020 UTC = Sun Oct 25 01:59:59 2020 IDT isdst=1
Israel  Sat Oct 24 23:00:00 2020 UTC = Sun Oct 25 01:00:00 2020 IST isdst=0
Israel  Thu Mar 25 23:59:59 2021 UTC = Fri Mar 26 01:59:59 2021 IST isdst=0
Israel  Fri Mar 26 00:00:00 2021 UTC = Fri Mar 26 03:00:00 2021 IDT isdst=1
Israel  Sat Oct 30 22:59:59 2021 UTC = Sun Oct 31 01:59:59 2021 IDT isdst=1
Israel  Sat Oct 30 23:00:00 2021 UTC = Sun Oct 31 01:00:00 2021 IST isdst=0
Israel  Thu Mar 24 23:59:59 2022 UTC = Fri Mar 25 01:59:59 2022 IST isdst=0
Israel  Fri Mar 25 00:00:00 2022 UTC = Fri Mar 25 03:00:00 2022 IDT isdst=1
Israel  Sat Oct 29 22:59:59 2022 UTC = Sun Oct 30 01:59:59 2022 IDT isdst=1
Israel  Sat Oct 29 23:00:00 2022 UTC = Sun Oct 30 01:00:00 2022 IST isdst=0
Israel  Thu Mar 23 23:59:59 2023 UTC = Fri Mar 24 01:59:59 2023 IST isdst=0
Israel  Fri Mar 24 00:00:00 2023 UTC = Fri Mar 24 03:00:00 2023 IDT isdst=1
Israel  Sat Oct 28 22:59:59 2023 UTC = Sun Oct 29 01:59:59 2023 IDT isdst=1
Israel  Sat Oct 28 23:00:00 2023 UTC = Sun Oct 29 01:00:00 2023 IST isdst=0
Israel  Thu Mar 28 23:59:59 2024 UTC = Fri Mar 29 01:59:59 2024 IST isdst=0
Israel  Fri Mar 29 00:00:00 2024 UTC = Fri Mar 29 03:00:00 2024 IDT isdst=1
Israel  Sat Oct 26 22:59:59 2024 UTC = Sun Oct 27 01:59:59 2024 IDT isdst=1
Israel  Sat Oct 26 23:00:00 2024 UTC = Sun Oct 27 01:00:00 2024 IST isdst=0
Israel  Thu Mar 27 23:59:59 2025 UTC = Fri Mar 28 01:59:59 2025 IST isdst=0
Israel  Fri Mar 28 00:00:00 2025 UTC = Fri Mar 28 03:00:00 2025 IDT isdst=1
Israel  Sat Oct 25 22:59:59 2025 UTC = Sun Oct 26 01:59:59 2025 IDT isdst=1
Israel  Sat Oct 25 23:00:00 2025 UTC = Sun Oct 26 01:00:00 2025 IST isdst=0
Israel  Thu Mar 26 23:59:59 2026 UTC = Fri Mar 27 01:59:59 2026 IST isdst=0
Israel  Fri Mar 27 00:00:00 2026 UTC = Fri Mar 27 03:00:00 2026 IDT isdst=1
Israel  Sat Oct 24 22:59:59 2026 UTC = Sun Oct 25 01:59:59 2026 IDT isdst=1
Israel  Sat Oct 24 23:00:00 2026 UTC = Sun Oct 25 01:00:00 2026 IST isdst=0
Israel  Thu Mar 25 23:59:59 2027 UTC = Fri Mar 26 01:59:59 2027 IST isdst=0
Israel  Fri Mar 26 00:00:00 2027 UTC = Fri Mar 26 03:00:00 2027 IDT isdst=1
Israel  Sat Oct 30 22:59:59 2027 UTC = Sun Oct 31 01:59:59 2027 IDT isdst=1
Israel  Sat Oct 30 23:00:00 2027 UTC = Sun Oct 31 01:00:00 2027 IST isdst=0
Israel  Thu Mar 23 23:59:59 2028 UTC = Fri Mar 24 01:59:59 2028 IST isdst=0
Israel  Fri Mar 24 00:00:00 2028 UTC = Fri Mar 24 03:00:00 2028 IDT isdst=1
Israel  Sat Oct 28 22:59:59 2028 UTC = Sun Oct 29 01:59:59 2028 IDT isdst=1
Israel  Sat Oct 28 23:00:00 2028 UTC = Sun Oct 29 01:00:00 2028 IST isdst=0
Israel  Thu Mar 22 23:59:59 2029 UTC = Fri Mar 23 01:59:59 2029 IST isdst=0
Israel  Fri Mar 23 00:00:00 2029 UTC = Fri Mar 23 03:00:00 2029 IDT isdst=1
Israel  Sat Oct 27 22:59:59 2029 UTC = Sun Oct 28 01:59:59 2029 IDT isdst=1
Israel  Sat Oct 27 23:00:00 2029 UTC = Sun Oct 28 01:00:00 2029 IST isdst=0
Israel  Thu Mar 28 23:59:59 2030 UTC = Fri Mar 29 01:59:59 2030 IST isdst=0
Israel  Fri Mar 29 00:00:00 2030 UTC = Fri Mar 29 03:00:00 2030 IDT isdst=1
Israel  Sat Oct 26 22:59:59 2030 UTC = Sun Oct 27 01:59:59 2030 IDT isdst=1
Israel  Sat Oct 26 23:00:00 2030 UTC = Sun Oct 27 01:00:00 2030 IST isdst=0
Israel  Thu Mar 27 23:59:59 2031 UTC = Fri Mar 28 01:59:59 2031 IST isdst=0
Israel  Fri Mar 28 00:00:00 2031 UTC = Fri Mar 28 03:00:00 2031 IDT isdst=1
Israel  Sat Oct 25 22:59:59 2031 UTC = Sun Oct 26 01:59:59 2031 IDT isdst=1
Israel  Sat Oct 25 23:00:00 2031 UTC = Sun Oct 26 01:00:00 2031 IST isdst=0
Israel  Thu Mar 25 23:59:59 2032 UTC = Fri Mar 26 01:59:59 2032 IST isdst=0
Israel  Fri Mar 26 00:00:00 2032 UTC = Fri Mar 26 03:00:00 2032 IDT isdst=1

ToCode
1 420
Israel  Sat Sep 30 22:59:59 2006 UTC = Sun Oct  1 01:59:59 2006 IDT isdst=1
Israel  Sat Sep 30 23:00:00 2006 UTC = Sun Oct  1 01:00:00 2006 IST isdst=0
Israel  Thu Mar 29 23:59:59 2007 UTC = Fri Mar 30 01:59:59 2007 IST isdst=0
Israel  Fri Mar 30 00:00:00 2007 UTC = Fri Mar 30 03:00:00 2007 IDT isdst=1
Israel  Sat Sep 15 22:59:59 2007 UTC = Sun Sep 16 01:59:59 2007 IDT isdst=1
Israel  Sat Sep 15 23:00:00 2007 UTC = Sun Sep 16 01:00:00 2007 IST isdst=0
Israel  Thu Mar 27 23:59:59 2008 UTC = Fri Mar 28 01:59:59 2008 IST isdst=0
Israel  Fri Mar 28 00:00:00 2008 UTC = Fri Mar 28 03:00:00 2008 IDT isdst=1
Israel  Sat Oct  4 22:59:59 2008 UTC = Sun Oct  5 01:59:59 2008 IDT isdst=1
Israel  Sat Oct  4 23:00:00 2008 UTC = Sun Oct  5 01:00:00 2008 IST isdst=0
Israel  Thu Mar 26 23:59:59 2009 UTC = Fri Mar 27 01:59:59 2009 IST isdst=0
Israel  Fri Mar 27 00:00:00 2009 UTC = Fri Mar 27 03:00:00 2009 IDT isdst=1
Israel  Sat Sep 26 22:59:59 2009 UTC = Sun Sep 27 01:59:59 2009 IDT isdst=1
Israel  Sat Sep 26 23:00:00 2009 UTC = Sun Sep 27 01:00:00 2009 IST isdst=0
Israel  Thu Mar 25 23:59:59 2010 UTC = Fri Mar 26 01:59:59 2010 IST isdst=0
Israel  Fri Mar 26 00:00:00 2010 UTC = Fri Mar 26 03:00:00 2010 IDT isdst=1
Israel  Sat Sep 11 22:59:59 2010 UTC = Sun Sep 12 01:59:59 2010 IDT isdst=1
Israel  Sat Sep 11 23:00:00 2010 UTC = Sun Sep 12 01:00:00 2010 IST isdst=0
Israel  Thu Mar 31 23:59:59 2011 UTC = Fri Apr  1 01:59:59 2011 IST isdst=0
Israel  Fri Apr  1 00:00:00 2011 UTC = Fri Apr  1 03:00:00 2011 IDT isdst=1
Israel  Sat Oct  1 22:59:59 2011 UTC = Sun Oct  2 01:59:59 2011 IDT isdst=1
Israel  Sat Oct  1 23:00:00 2011 UTC = Sun Oct  2 01:00:00 2011 IST isdst=0
Israel  Thu Mar 29 23:59:59 2012 UTC = Fri Mar 30 01:59:59 2012 IST isdst=0
Israel  Fri Mar 30 00:00:00 2012 UTC = Fri Mar 30 03:00:00 2012 IDT isdst=1
Israel  Sat Sep 22 22:59:59 2012 UTC = Sun Sep 23 01:59:59 2012 IDT isdst=1
Israel  Sat Sep 22 23:00:00 2012 UTC = Sun Sep 23 01:00:00 2012 IST isdst=0
Israel  Thu Mar 28 23:59:59 2013 UTC = Fri Mar 29 01:59:59 2013 IST isdst=0
Israel  Fri Mar 29 00:00:00 2013 UTC = Fri Mar 29 03:00:00 2013 IDT isdst=1
Israel  Sat Oct 26 22:59:59 2013 UTC = Sun Oct 27 01:59:59 2013 IDT isdst=1
Israel  Sat Oct 26 23:00:00 2013 UTC = Sun Oct 27 01:00:00 2013 IST isdst=0
Israel  Thu Mar 27 23:59:59 2014 UTC = Fri Mar 28 01:59:59 2014 IST isdst=0
Israel  Fri Mar 28 00:00:00 2014 UTC = Fri Mar 28 03:00:00 2014 IDT isdst=1
Israel  Sat Oct 25 22:59:59 2014 UTC = Sun Oct 26 01:59:59 2014 IDT isdst=1
Israel  Sat Oct 25 23:00:00 2014 UTC = Sun Oct 26 01:00:00 2014 IST isdst=0
Israel  Thu Mar 26 23:59:59 2015 UTC = Fri Mar 27 01:59:59 2015 IST isdst=0
Israel  Fri Mar 27 00:00:00 2015 UTC = Fri Mar 27 03:00:00 2015 IDT isdst=1
Israel  Sat Oct 24 22:59:59 2015 UTC = Sun Oct 25 01:59:59 2015 IDT isdst=1
Israel  Sat Oct 24 23:00:00 2015 UTC = Sun Oct 25 01:00:00 2015 IST isdst=0
Israel  Thu Mar 24 23:59:59 2016 UTC = Fri Mar 25 01:59:59 2016 IST isdst=0
Israel  Fri Mar 25 00:00:00 2016 UTC = Fri Mar 25 03:00:00 2016 IDT isdst=1
Israel  Sat Oct 29 22:59:59 2016 UTC = Sun Oct 30 01:59:59 2016 IDT isdst=1
Israel  Sat Oct 29 23:00:00 2016 UTC = Sun Oct 30 01:00:00 2016 IST isdst=0
Israel  Thu Mar 23 23:59:59 2017 UTC = Fri Mar 24 01:59:59 2017 IST isdst=0
Israel  Fri Mar 24 00:00:00 2017 UTC = Fri Mar 24 03:00:00 2017 IDT isdst=1
Israel  Sat Oct 28 22:59:59 2017 UTC = Sun Oct 29 01:59:59 2017 IDT isdst=1
Israel  Sat Oct 28 23:00:00 2017 UTC = Sun Oct 29 01:00:00 2017 IST isdst=0
Israel  Thu Mar 22 23:59:59 2018 UTC = Fri Mar 23 01:59:59 2018 IST isdst=0
Israel  Fri Mar 23 00:00:00 2018 UTC = Fri Mar 23 03:00:00 2018 IDT isdst=1
Israel  Sat Oct 27 22:59:59 2018 UTC = Sun Oct 28 01:59:59 2018 IDT isdst=1
Israel  Sat Oct 27 23:00:00 2018 UTC = Sun Oct 28 01:00:00 2018 IST isdst=0
Israel  Thu Mar 28 23:59:59 2019 UTC = Fri Mar 29 01:59:59 2019 IST isdst=0
Israel  Fri Mar 29 00:00:00 2019 UTC = Fri Mar 29 03:00:00 2019 IDT isdst=1

ToCode
1 420
Israel  Sat Sep  4 20:59:59 1993 UTC = Sat Sep  4 23:59:59 1993 IDT isdst=1
Israel  Sat Sep  4 21:00:00 1993 UTC = Sat Sep  4 23:00:00 1993 IST isdst=0
Israel  Thu Mar 31 21:59:59 1994 UTC = Thu Mar 31 23:59:59 1994 IST isdst=0
Israel  Thu Mar 31 22:00:00 1994 UTC = Fri Apr  1 01:00:00 1994 IDT isdst=1
Israel  Sat Aug 27 20:59:59 1994 UTC = Sat Aug 27 23:59:59 1994 IDT isdst=1
Israel  Sat Aug 27 21:00:00 1994 UTC = Sat Aug 27 23:00:00 1994 IST isdst=0
Israel  Thu Mar 30 21:59:59 1995 UTC = Thu Mar 30 23:59:59 1995 IST isdst=0
Israel  Thu Mar 30 22:00:00 1995 UTC = Fri Mar 31 01:00:00 1995 IDT isdst=1
Israel  Sat Sep  2 20:59:59 1995 UTC = Sat Sep  2 23:59:59 1995 IDT isdst=1
Israel  Sat Sep  2 21:00:00 1995 UTC = Sat Sep  2 23:00:00 1995 IST isdst=0
Israel  Thu Mar 14 21:59:59 1996 UTC = Thu Mar 14 23:59:59 1996 IST isdst=0
Israel  Thu Mar 14 22:00:00 1996 UTC = Fri Mar 15 01:00:00 1996 IDT isdst=1
Israel  Sun Sep 15 20:59:59 1996 UTC = Sun Sep 15 23:59:59 1996 IDT isdst=1
Israel  Sun Sep 15 21:00:00 1996 UTC = Sun Sep 15 23:00:00 1996 IST isdst=0
Israel  Thu Mar 20 21:59:59 1997 UTC = Thu Mar 20 23:59:59 1997 IST isdst=0
Israel  Thu Mar 20 22:00:00 1997 UTC = Fri Mar 21 01:00:00 1997 IDT isdst=1
Israel  Sat Sep 13 20:59:59 1997 UTC = Sat Sep 13 23:59:59 1997 IDT isdst=1
Israel  Sat Sep 13 21:00:00 1997 UTC = Sat Sep 13 23:00:00 1997 IST isdst=0
Israel  Thu Mar 19 21:59:59 1998 UTC = Thu Mar 19 23:59:59 1998 IST isdst=0
Israel  Thu Mar 19 22:00:00 1998 UTC = Fri Mar 20 01:00:00 1998 IDT isdst=1
Israel  Sat Sep  5 20:59:59 1998 UTC = Sat Sep  5 23:59:59 1998 IDT isdst=1
Israel  Sat Sep  5 21:00:00 1998 UTC = Sat Sep  5 23:00:00 1998 IST isdst=0
Israel  Thu Apr  1 23:59:59 1999 UTC = Fri Apr  2 01:59:59 1999 IST isdst=0
Israel  Fri Apr  2 00:00:00 1999 UTC = Fri Apr  2 03:00:00 1999 IDT isdst=1
Israel  Thu Sep  2 22:59:59 1999 UTC = Fri Sep  3 01:59:59 1999 IDT isdst=1
Israel  Thu Sep  2 23:00:00 1999 UTC = Fri Sep  3 01:00:00 1999 IST isdst=0
Israel  Thu Apr 13 23:59:59 2000 UTC = Fri Apr 14 01:59:59 2000 IST isdst=0
Israel  Fri Apr 14 00:00:00 2000 UTC = Fri Apr 14 03:00:00 2000 IDT isdst=1
Israel  Thu Oct  5 21:59:59 2000 UTC = Fri Oct  6 00:59:59 2000 IDT isdst=1
Israel  Thu Oct  5 22:00:00 2000 UTC = Fri Oct  6 00:00:00 2000 IST isdst=0
Israel  Sun Apr  8 22:59:59 2001 UTC = Mon Apr  9 00:59:59 2001 IST isdst=0
Israel  Sun Apr  8 23:00:00 2001 UTC = Mon Apr  9 02:00:00 2001 IDT isdst=1
Israel  Sun Sep 23 21:59:59 2001 UTC = Mon Sep 24 00:59:59 2001 IDT isdst=1
Israel  Sun Sep 23 22:00:00 2001 UTC = Mon Sep 24 00:00:00 2001 IST isdst=0
Israel  Thu Mar 28 22:59:59 2002 UTC = Fri Mar 29 00:59:59 2002 IST isdst=0
Israel  Thu Mar 28 23:00:00 2002 UTC = Fri Mar 29 02:00:00 2002 IDT isdst=1
Israel  Sun Oct  6 21:59:59 2002 UTC = Mon Oct  7 00:59:59 2002 IDT isdst=1
Israel  Sun Oct  6 22:00:00 2002 UTC = Mon Oct  7 00:00:00 2002 IST isdst=0
Israel  Thu Mar 27 22:59:59 2003 UTC = Fri Mar 28 00:59:59 2003 IST isdst=0
Israel  Thu Mar 27 23:00:00 2003 UTC = Fri Mar 28 02:00:00 2003 IDT isdst=1
Israel  Thu Oct  2 21:59:59 2003 UTC = Fri Oct  3 00:59:59 2003 IDT isdst=1
Israel  Thu Oct  2 22:00:00 2003 UTC = Fri Oct  3 00:00:00 2003 IST isdst=0
Israel  Tue Apr  6 22:59:59 2004 UTC = Wed Apr  7 00:59:59 2004 IST isdst=0
Israel  Tue Apr  6 23:00:00 2004 UTC = Wed Apr  7 02:00:00 2004 IDT isdst=1
Israel  Tue Sep 21 21:59:59 2004 UTC = Wed Sep 22 00:59:59 2004 IDT isdst=1
Israel  Tue Sep 21 22:00:00 2004 UTC = Wed Sep 22 00:00:00 2004 IST isdst=0
Israel  Thu Mar 31 23:59:59 2005 UTC = Fri Apr  1 01:59:59 2005 IST isdst=0
Israel  Fri Apr  1 00:00:00 2005 UTC = Fri Apr  1 03:00:00 2005 IDT isdst=1
Israel  Sat Oct  8 22:59:59 2005 UTC = Sun Oct  9 01:59:59 2005 IDT isdst=1
Israel  Sat Oct  8 23:00:00 2005 UTC = Sun Oct  9 01:00:00 2005 IST isdst=0
Israel  Thu Mar 30 23:59:59 2006 UTC = Fri Mar 31 01:59:59 2006 IST isdst=0
Israel  Fri Mar 31 00:00:00 2006 UTC = Fri Mar 31 03:00:00 2006 IDT isdst=1

ToCode
1 420
Israel  Sat Sep 21 23:59:59 1957 UTC = Sun Sep 22 02:59:59 1957 IDT isdst=1
Israel  Sun Sep 22 00:00:00 1957 UTC = Sun Sep 22 02:00:00 1957 IST isdst=0
Israel  Sat Jul  6 21:59:59 1974 UTC = Sat Jul  6 23:59:59 1974 IST isdst=0
Israel  Sat Jul  6 22:00:00 1974 UTC = Sun Jul  7 01:00:00 1974 IDT isdst=1
Israel  Sat Oct 12 20:59:59 1974 UTC = Sat Oct 12 23:59:59 1974 IDT isdst=1
Israel  Sat Oct 12 21:00:00 1974 UTC = Sat Oct 12 23:00:00 1974 IST isdst=0
Israel  Sat Apr 19 21:59:59 1975 UTC = Sat Apr 19 23:59:59 1975 IST isdst=0
Israel  Sat Apr 19 22:00:00 1975 UTC = Sun Apr 20 01:00:00 1975 IDT isdst=1
Israel  Sat Aug 30 20:59:59 1975 UTC = Sat Aug 30 23:59:59 1975 IDT isdst=1
Israel  Sat Aug 30 21:00:00 1975 UTC = Sat Aug 30 23:00:00 1975 IST isdst=0
Israel  Sat Aug  2 21:59:59 1980 UTC = Sat Aug  2 23:59:59 1980 IST isdst=0
Israel  Sat Aug  2 22:00:00 1980 UTC = Sun Aug  3 01:00:00 1980 IDT isdst=1
Israel  Sat Sep 13 21:59:59 1980 UTC = Sun Sep 14 00:59:59 1980 IDT isdst=1
Israel  Sat Sep 13 22:00:00 1980 UTC = Sun Sep 14 00:00:00 1980 IST isdst=0
Israel  Sat May  5 21:59:59 1984 UTC = Sat May  5 23:59:59 1984 IST isdst=0
Israel  Sat May  5 22:00:00 1984 UTC = Sun May  6 01:00:00 1984 IDT isdst=1
Israel  Sat Aug 25 21:59:59 1984 UTC = Sun Aug 26 00:59:59 1984 IDT isdst=1
Israel  Sat Aug 25 22:00:00 1984 UTC = Sun Aug 26 00:00:00 1984 IST isdst=0
Israel  Sat Apr 13 21:59:59 1985 UTC = Sat Apr 13 23:59:59 1985 IST isdst=0
Israel  Sat Apr 13 22:00:00 1985 UTC = Sun Apr 14 01:00:00 1985 IDT isdst=1
Israel  Sat Aug 31 20:59:59 1985 UTC = Sat Aug 31 23:59:59 1985 IDT isdst=1
Israel  Sat Aug 31 21:00:00 1985 UTC = Sat Aug 31 23:00:00 1985 IST isdst=0
Israel  Sat May 17 21:59:59 1986 UTC = Sat May 17 23:59:59 1986 IST isdst=0
Israel  Sat May 17 22:00:00 1986 UTC = Sun May 18 01:00:00 1986 IDT isdst=1
Israel  Sat Sep  6 20:59:59 1986 UTC = Sat Sep  6 23:59:59 1986 IDT isdst=1
Israel  Sat Sep  6 21:00:00 1986 UTC = Sat Sep  6 23:00:00 1986 IST isdst=0
Israel  Tue Apr 14 21:59:59 1987 UTC = Tue Apr 14 23:59:59 1987 IST isdst=0
Israel  Tue Apr 14 22:00:00 1987 UTC = Wed Apr 15 01:00:00 1987 IDT isdst=1
Israel  Sat Sep 12 20:59:59 1987 UTC = Sat Sep 12 23:59:59 1987 IDT isdst=1
Israel  Sat Sep 12 21:00:00 1987 UTC = Sat Sep 12 23:00:00 1987 IST isdst=0
Israel  Sat Apr  9 21:59:59 1988 UTC = Sat Apr  9 23:59:59 1988 IST isdst=0
Israel  Sat Apr  9 22:00:00 1988 UTC = Sun Apr 10 01:00:00 1988 IDT isdst=1
Israel  Sat Sep  3 20:59:59 1988 UTC = Sat Sep  3 23:59:59 1988 IDT isdst=1
Israel  Sat Sep  3 21:00:00 1988 UTC = Sat Sep  3 23:00:00 1988 IST isdst=0
Israel  Sat Apr 29 21:59:59 1989 UTC = Sat Apr 29 23:59:59 1989 IST isdst=0
Israel  Sat Apr 29 22:00:00 1989 UTC = Sun Apr 30 01:00:00 1989 IDT isdst=1
Israel  Sat Sep  2 20:59:59 1989 UTC = Sat Sep  2 23:59:59 1989 IDT isdst=1
Israel  Sat Sep  2 21:00:00 1989 UTC = Sat Sep  2 23:00:00 1989 IST isdst=0
Israel  Sat Mar 24 21:59:59 1990 UTC = Sat Mar 24 23:59:59 1990 IST isdst=0
Israel  Sat Mar 24 22:00:00 1990 UTC = Sun Mar 25 01:00:00 1990 IDT isdst=1
Israel  Sat Aug 25 20:59:59 1990 UTC = Sat Aug 25 23:59:59 1990 IDT isdst=1
Israel  Sat Aug 25 21:00:00 1990 UTC = Sat Aug 25 23:00:00 1990 IST isdst=0
Israel  Sat Mar 23 21:59:59 1991 UTC = Sat Mar 23 23:59:59 1991 IST isdst=0
Israel  Sat Mar 23 22:00:00 1991 UTC = Sun Mar 24 01:00:00 1991 IDT isdst=1
Israel  Sat Aug 31 20:59:59 1991 UTC = Sat Aug 31 23:59:59 1991 IDT isdst=1
Israel  Sat Aug 31 21:00:00 1991 UTC = Sat Aug 31 23:00:00 1991 IST isdst=0
Israel  Sat Mar 28 21:59:59 1992 UTC = Sat Mar 28 23:59:59 1992 IST isdst=0
Israel  Sat Mar 28 22:00:00 1992 UTC = Sun Mar 29 01:00:00 1992 IDT isdst=1
Israel  Sat Sep  5 20:59:59 1992 UTC = Sat Sep  5 23:59:59 1992 IDT isdst=1
Israel  Sat Sep  5 21:00:00 1992 UTC = Sat Sep  5 23:00:00 1992 IST isdst=0
Israel  Thu Apr  1 21:59:59 1993 UTC = Thu Apr  1 23:59:59 1993 IST isdst=0
Israel  Thu Apr  1 22:00:00 1993 UTC = Fri Apr  2 01:00:00 1993 IDT isdst=1

ToCode
1 420
Israel  Fri Mar 31 23:59:59 1944 UTC = Sat Apr  1 01:59:59 1944 IST isdst=0
Israel  Sat Apr  1 00:00:00 1944 UTC = Sat Apr  1 03:00:00 1944 IDT isdst=1
Israel  Tue Oct 31 23:59:59 1944 UTC = Wed Nov  1 02:59:59 1944 IDT isdst=1
Israel  Wed Nov  1 00:00:00 1944 UTC = Wed Nov  1 02:00:00 1944 IST isdst=0
Israel  Sun Apr 15 23:59:59 1945 UTC = Mon Apr 16 01:59:59 1945 IST isdst=0
Israel  Mon Apr 16 00:00:00 1945 UTC = Mon Apr 16 03:00:00 1945 IDT isdst=1
Israel  Wed Oct 31 23:59:59 1945 UTC = Thu Nov  1 02:59:59 1945 IDT isdst=1
Israel  Thu Nov  1 00:00:00 1945 UTC = Thu Nov  1 02:00:00 1945 IST isdst=0
Israel  Mon Apr 15 23:59:59 1946 UTC = Tue Apr 16 01:59:59 1946 IST isdst=0
Israel  Tue Apr 16 00:00:00 1946 UTC = Tue Apr 16 03:00:00 1946 IDT isdst=1
Israel  Thu Oct 31 23:59:59 1946 UTC = Fri Nov  1 02:59:59 1946 IDT isdst=1
Israel  Fri Nov  1 00:00:00 1946 UTC = Fri Nov  1 02:00:00 1946 IST isdst=0
Israel  Sat May 22 23:59:59 1948 UTC = Sun May 23 01:59:59 1948 IST isdst=0
Israel  Sun May 23 00:00:00 1948 UTC = Sun May 23 04:00:00 1948 IDDT isdst=1
Israel  Tue Aug 31 23:59:59 1948 UTC = Wed Sep  1 03:59:59 1948 IDDT isdst=1
Israel  Wed Sep  1 00:00:00 1948 UTC = Wed Sep  1 03:00:00 1948 IDT isdst=1
Israel  Sun Oct 31 23:59:59 1948 UTC = Mon Nov  1 02:59:59 1948 IDT isdst=1
Israel  Mon Nov  1 00:00:00 1948 UTC = Mon Nov  1 02:00:00 1948 IST isdst=0
Israel  Sat Apr 30 23:59:59 1949 UTC = Sun May  1 01:59:59 1949 IST isdst=0
Israel  Sun May  1 00:00:00 1949 UTC = Sun May  1 03:00:00 1949 IDT isdst=1
Israel  Mon Oct 31 23:59:59 1949 UTC = Tue Nov  1 02:59:59 1949 IDT isdst=1
Israel  Tue Nov  1 00:00:00 1949 UTC = Tue Nov  1 02:00:00 1949 IST isdst=0
Israel  Sat Apr 15 23:59:59 1950 UTC = Sun Apr 16 01:59:59 1950 IST isdst=0
Israel  Sun Apr 16 00:00:00 1950 UTC = Sun Apr 16 03:00:00 1950 IDT isdst=1
Israel  Thu Sep 14 23:59:59 1950 UTC = Fri Sep 15 02:59:59 1950 IDT isdst=1
Israel  Fri Sep 15 00:00:00 1950 UTC = Fri Sep 15 02:00:00 1950 IST isdst=0
Israel  Sat Mar 31 23:59:59 1951 UTC = Sun Apr  1 01:59:59 1951 IST isdst=0
Israel  Sun Apr  1 00:00:00 1951 UTC = Sun Apr  1 03:00:00 1951 IDT isdst=1
Israel  Sat Nov 10 23:59:59 1951 UTC = Sun Nov 11 02:59:59 1951 IDT isdst=1
Israel  Sun Nov 11 00:00:00 1951 UTC = Sun Nov 11 02:00:00 1951 IST isdst=0
Israel  Sat Apr 19 23:59:59 1952 UTC = Sun Apr 20 01:59:59 1952 IST isdst=0
Israel  Sun Apr 20 00:00:00 1952 UTC = Sun Apr 20 03:00:00 1952 IDT isdst=1
Israel  Sat Oct 18 23:59:59 1952 UTC = Sun Oct 19 02:59:59 1952 IDT isdst=1
Israel  Sun Oct 19 00:00:00 1952 UTC = Sun Oct 19 02:00:00 1952 IST isdst=0
Israel  Sat Apr 11 23:59:59 1953 UTC = Sun Apr 12 01:59:59 1953 IST isdst=0
Israel  Sun Apr 12 00:00:00 1953 UTC = Sun Apr 12 03:00:00 1953 IDT isdst=1
Israel  Sat Sep 12 23:59:59 1953 UTC = Sun Sep 13 02:59:59 1953 IDT isdst=1
Israel  Sun Sep 13 00:00:00 1953 UTC = Sun Sep 13 02:00:00 1953 IST isdst=0
Israel  Sat Jun 12 23:59:59 1954 UTC = Sun Jun 13 01:59:59 1954 IST isdst=0
Israel  Sun Jun 13 00:00:00 1954 UTC = Sun Jun 13 03:00:00 1954 IDT isdst=1
Israel  Sat Sep 11 23:59:59 1954 UTC = Sun Sep 12 02:59:59 1954 IDT isdst=1
Israel  Sun Sep 12 00:00:00 1954 UTC = Sun Sep 12 02:00:00 1954 IST isdst=0
Israel  Sat Jun 11 23:59:59 1955 UTC = Sun Jun 12 01:59:59 1955 IST isdst=0
Israel  Sun Jun 12 00:00:00 1955 UTC = Sun Jun 12 03:00:00 1955 IDT isdst=1
Israel  Sat Sep 10 23:59:59 1955 UTC = Sun Sep 11 02:59:59 1955 IDT isdst=1
Israel  Sun Sep 11 00:00:00 1955 UTC = Sun Sep 11 02:00:00 1955 IST isdst=0
Israel  Sat Jun  2 23:59:59 1956 UTC = Sun Jun  3 01:59:59 1956 IST isdst=0
Israel  Sun Jun  3 00:00:00 1956 UTC = Sun Jun  3 03:00:00 1956 IDT isdst=1
Israel  Sat Sep 29 23:59:59 1956 UTC = Sun Sep 30 02:59:59 1956 IDT isdst=1
Israel  Sun Sep 30 00:00:00 1956 UTC = Sun Sep 30 02:00:00 1956 IST isdst=0
Israel  Sat Apr 27 23:59:59 1957 UTC = Sun Apr 28 01:59:59 1957 IST isdst=0
Israel  Sun Apr 28 00:00:00 1957 UTC = Sun Apr 28 03:00:00 1957 IDT isdst=1

ToCode - إحصائيات وتحليلات قناة تيليجرام @tocodeil