השוואת שני תאריכים

C:
השוואת שני תאריכים

איך לעשות:

C אינה כוללת סוג מובנה לתאריכים, מה שגורם לצורך בשימוש בספריית time.h על מנת לעבוד עם מבני תאריך וזמן. המבנה tm והפונקציה difftime() נפוצים לשימוש בהשוואת תאריכים. להלן דוגמה להשוואה בין שני תאריכים:

#include <stdio.h>
#include <time.h>

int main() {
    struct tm date1 = {0};
    struct tm date2 = {0};
    double seconds;

    // תאריך ראשון (YYYY, MM, DD)
    date1.tm_year = 2023 - 1900; // שנה מאז 1900
    date1.tm_mon = 3 - 1;        // חודש [0-11]
    date1.tm_mday = 15;          // יום בחודש [1-31]

    // תאריך שני (YYYY, MM, DD)
    date2.tm_year = 2023 - 1900;
    date2.tm_mon = 4 - 1;
    date2.tm_mday = 14;

    // המרה לפורמט time_t
    time_t time1 = mktime(&date1);
    time_t time2 = mktime(&date2);

    // השוואה
    seconds = difftime(time1, time2);

    if (seconds == 0) {
        printf("התאריכים זהים.\n");
    } else if (seconds > 0) {
        printf("התאריך הראשון אחרי התאריך השני.\n");
    } else {
        printf("התאריך הראשון לפני התאריך השני.\n");
    }

    return 0;
}

הפלט עשוי להיות:

התאריך הראשון לפני התאריך השני.

תכנית זו מאתחלת שני מבני נתונים tm עם תאריכים ספציפיים, ממירה אותם לפורמט time_t באמצעות mktime(), ולבסוף משווה את התאריכים באמצעות difftime(), שמחזירה את ההפרש בשניות (כמספר מסוג double) בין שני הזמנים.

צלילה עמוקה

בימים הראשונים של שפת C, פעולות של תאריך וזמן דרשו חישובים ידניים, לעיתים כוללות בחישובן שנים מעוברות, מספר שונה של ימים בחודשים, ואף שניות מעוברות. הצגת time.h בתקן ANSI C הביאה לתקנון בטיפול בזמנים ב-C, ופשטה את פעולות התאריך והזמן.

השימוש ב-time.h להשוואת תאריכים הוא די פשוט אך נתון למגבלות. המבנה tm אינו כולל בתוכו אזורי זמן או שינויי שעה קיצוניים (דיילייט סייבינג), ו-difftime() מספק רק את ההפרש בשניות, מה שאינו מספק דיוק רב לצורך מסוים.

ליישומים הדורשים פעולות תאריך-זמן חזקות יותר, כולל תמיכה באזורי זמן, מעברי שעה קיצוניים ומרווחי זמן מדויקים יותר, ספריות כמו date.h (ספרייה של הואורד הינאנט, אינה חלק מהספרייה הסטנדרטית) מציעות חלופה מודרנית ל-time.h. ספריות אלו מספקות כלים מקיפים יותר לניהול תאריך-זמן ב-C++, ונהנות מעשורים של התפתחות בעיצוב שפות התכנות. למתכנתי C, נדרשת הסתמכות על ספריות חיצוניות אלו או התמודדות מדויקת עם מורכבויות החישובים של תאריך-זמן באופן ישיר, על מנת להשיג ניהול תאריך-זמן מדויק ומודע לתרבות.