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. More...
 
static int leap_years_to_end (int tm_year)
 Calculate number of leap years since 1900. More...
 
static int day_of_week (int tm_year, int tm_mon, int tm_mday)
 Calculate day of week. More...
 
time_t mktime (struct tm *tm)
 Calculate seconds since the Epoch. More...
 

Variables

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

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()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ is_leap_year()

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.

60  {
61  int leap_year = 0;
62 
63  if ( ( tm_year % 4 ) == 0 )
64  leap_year = 1;
65  if ( ( tm_year % 100 ) == 0 )
66  leap_year = 0;
67  if ( ( tm_year % 400 ) == 100 )
68  leap_year = 1;
69 
70  return leap_year;
71 }

Referenced by mktime().

◆ leap_years_to_end()

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.

79  {
80  int leap_years = 0;
81 
82  leap_years += ( tm_year / 4 );
83  leap_years -= ( tm_year / 100 );
84  leap_years += ( ( tm_year + 300 ) / 400 );
85 
86  return leap_years;
87 }

Referenced by day_of_week(), and mktime().

◆ day_of_week()

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.

96  {
97  static const uint8_t offset[12] =
98  { 1, 4, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 };
99  int pseudo_year = tm_year;
100 
101  if ( tm_mon < 2 )
102  pseudo_year--;
103  return ( ( pseudo_year + leap_years_to_end ( pseudo_year ) +
104  offset[tm_mon] + tm_mday ) % 7 );
105 }
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
unsigned char uint8_t
Definition: stdint.h:10
static int leap_years_to_end(int tm_year)
Calculate number of leap years since 1900.
Definition: time.c:79

References leap_years_to_end(), and offset.

Referenced by mktime().

◆ mktime()

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.

117  {
118  int days_since_epoch;
119  int seconds_since_day;
120  time_t seconds;
121 
122  /* Calculate day of year */
123  tm->tm_yday = ( ( tm->tm_mday - 1 ) +
125  if ( ( tm->tm_mon >= 2 ) && is_leap_year ( tm->tm_year ) )
126  tm->tm_yday++;
127 
128  /* Calculate day of week */
130 
131  /* Calculate seconds since the Epoch */
132  days_since_epoch = ( tm->tm_yday + ( 365 * tm->tm_year ) - 25567 +
133  leap_years_to_end ( tm->tm_year - 1 ) );
134  seconds_since_day =
135  ( ( ( ( tm->tm_hour * 60 ) + tm->tm_min ) * 60 ) + tm->tm_sec );
136  seconds = ( ( ( ( time_t ) days_since_epoch ) * ( ( time_t ) 86400 ) ) +
137  seconds_since_day );
138 
139  DBGC ( &weekdays, "TIME %04d-%02d-%02d %02d:%02d:%02d => %lld (%s, "
140  "day %d)\n", ( tm->tm_year + 1900 ), ( tm->tm_mon + 1 ),
142  weekdays[ tm->tm_wday ], tm->tm_yday );
143 
144  return seconds;
145 }
static int day_of_week(int tm_year, int tm_mon, int tm_mday)
Calculate day of week.
Definition: time.c:96
int tm_min
Minutes [0,59].
Definition: time.h:19
int tm_mday
Day of month [1,31].
Definition: time.h:23
#define DBGC(...)
Definition: compiler.h:505
int tm_year
Years since 1900.
Definition: time.h:27
static int is_leap_year(int tm_year)
Determine whether or not year is a leap year.
Definition: time.c:60
int tm_mon
Month of year [0,11].
Definition: time.h:25
Broken-down time.
Definition: time.h:15
int tm_wday
Day of week [0,6] (Sunday=0)
Definition: time.h:29
int tm_yday
Day of year [0,365].
Definition: time.h:31
static const char * weekdays[]
Days of week (for debugging)
Definition: time.c:50
static int leap_years_to_end(int tm_year)
Calculate number of leap years since 1900.
Definition: time.c:79
UINT16_t seconds
Elapsed time.
Definition: pxe_api.h:81
int tm_sec
Seconds [0,60].
Definition: time.h:17
int tm_hour
Hour [0,23].
Definition: time.h:21
static const uint16_t days_to_month_start[]
Days from start of year until start of months (in non-leap years)
Definition: time.c:108
int64_t time_t
Seconds since the Epoch.
Definition: time.h:18

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().

Variable Documentation

◆ time_offset

signed long time_offset

Current system clock offset.

Definition at line 47 of file time.c.

Referenced by __attribute__().

◆ weekdays

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().

◆ days_to_month_start

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().