iPXE
|
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) |
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.
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.
tm_year | Years since 1900 |
is_leap_year | Year 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.
tm_year | Years since 1900 |
num_leap_years | Number 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.
tm_year | Years since 1900 |
tm_mon | Month of year [0,11] |
tm_day | Day 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 ); }
Calculate seconds since the Epoch.
tm | Broken-down time |
time | Seconds 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; }
signed long time_offset |
const char* weekdays[] [static] |
const uint16_t days_to_month_start[] [static] |