iPXE
Functions | Variables
time.c File Reference

Date and time. More...

#include <time.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static int is_leap_year (int tm_year)
 Determine whether or not year is a leap year.
static int leap_years_to_end (int tm_year)
 Calculate number of leap years since 1900.
static int day_of_week (int tm_year, int tm_mon, int tm_mday)
 Calculate day of week.
time_t mktime (struct tm *tm)
 Calculate seconds since the Epoch.

Variables

signed long time_offset
 Current system clock offset.
static const char * weekdays []
 Days of week (for debugging)
static const uint16_t days_to_month_start []
 Days from start of year until start of months (in non-leap years)

Detailed Description

Date and time.

POSIX:2008 section 4.15 defines "seconds since the Epoch" as an abstract measure approximating the number of seconds that have elapsed since the Epoch, excluding leap seconds. The formula given is

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400

This calculation assumes that leap years occur in each year that is either divisible by 4 but not divisible by 100, or is divisible by 400.

Definition in file time.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
static int is_leap_year ( int  tm_year) [static]

Determine whether or not year is a leap year.

Parameters:
tm_yearYears since 1900
is_leap_yearYear is a leap year

Definition at line 60 of file time.c.

Referenced by mktime().

                                        {
        int leap_year = 0;

        if ( ( tm_year % 4 ) == 0 )
                leap_year = 1;
        if ( ( tm_year % 100 ) == 0 )
                leap_year = 0;
        if ( ( tm_year % 400 ) == 100 )
                leap_year = 1;

        return leap_year;
}
static int leap_years_to_end ( int  tm_year) [static]

Calculate number of leap years since 1900.

Parameters:
tm_yearYears since 1900
num_leap_yearsNumber of leap years

Definition at line 79 of file time.c.

Referenced by day_of_week(), and mktime().

                                             {
        int leap_years = 0;

        leap_years += ( tm_year / 4 );
        leap_years -= ( tm_year / 100 );
        leap_years += ( ( tm_year + 300 ) / 400 );

        return leap_years;
}
static int day_of_week ( int  tm_year,
int  tm_mon,
int  tm_mday 
) [static]

Calculate day of week.

Parameters:
tm_yearYears since 1900
tm_monMonth of year [0,11]
tm_dayDay of month [1,31]

Definition at line 96 of file time.c.

References leap_years_to_end(), and offset.

Referenced by mktime().

                                                                {
        static const uint8_t offset[12] =
                { 1, 4, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 };
        int pseudo_year = tm_year;

        if ( tm_mon < 2 )
                pseudo_year--;
        return ( ( pseudo_year + leap_years_to_end ( pseudo_year ) +
                   offset[tm_mon] + tm_mday ) % 7 );
}
time_t mktime ( struct tm tm)

Calculate seconds since the Epoch.

Parameters:
tmBroken-down time
Return values:
timeSeconds since the Epoch

Definition at line 117 of file time.c.

References day_of_week(), days_to_month_start, DBGC, is_leap_year(), leap_years_to_end(), seconds, tm::tm_hour, tm::tm_mday, tm::tm_min, tm::tm_mon, tm::tm_sec, tm::tm_wday, tm::tm_yday, tm::tm_year, and weekdays.

Referenced by asn1_generalized_time(), efi_get_time(), and rtc_read_time().

                                {
        int days_since_epoch;
        int seconds_since_day;
        time_t seconds;

        /* Calculate day of year */
        tm->tm_yday = ( ( tm->tm_mday - 1 ) +
                        days_to_month_start[ tm->tm_mon ] );
        if ( ( tm->tm_mon >= 2 ) && is_leap_year ( tm->tm_year ) )
                tm->tm_yday++;

        /* Calculate day of week */
        tm->tm_wday = day_of_week ( tm->tm_year, tm->tm_mon, tm->tm_mday );

        /* Calculate seconds since the Epoch */
        days_since_epoch = ( tm->tm_yday + ( 365 * tm->tm_year ) - 25567 +
                             leap_years_to_end ( tm->tm_year - 1 ) );
        seconds_since_day =
                ( ( ( ( tm->tm_hour * 60 ) + tm->tm_min ) * 60 ) + tm->tm_sec );
        seconds = ( ( ( ( time_t ) days_since_epoch ) * ( ( time_t ) 86400 ) ) +
                    seconds_since_day );

        DBGC ( &weekdays, "TIME %04d-%02d-%02d %02d:%02d:%02d => %lld (%s, "
               "day %d)\n", ( tm->tm_year + 1900 ), ( tm->tm_mon + 1 ),
               tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, seconds,
               weekdays[ tm->tm_wday ], tm->tm_yday );

        return seconds;
}

Variable Documentation

signed long time_offset

Current system clock offset.

Definition at line 47 of file time.c.

Referenced by __attribute__().

const char* weekdays[] [static]
Initial value:
 {
        "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
}

Days of week (for debugging)

Definition at line 50 of file time.c.

Referenced by mktime().

const uint16_t days_to_month_start[] [static]
Initial value:
        { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }

Days from start of year until start of months (in non-leap years)

Definition at line 108 of file time.c.

Referenced by mktime().