/** @file * * Copyright (c) 2016, Hisilicon Limited. All rights reserved. * Copyright (c) 2016-2019, Linaro Limited. All rights reserved. * Copyright (c) 2021, Ampere Computing LLC. All rights reserved. * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #ifndef _TIME_BASE_LIB_H_ #define _TIME_BASE_LIB_H_ #include // // Convenience macros to obtain a build date // // These macros should work for any compiler that follows ISO/IEC 9899, // in which case __DATE__ is defined as a "Mmm dd yyyy" 11 chars string, // but add an explicit filter for compilers that have been validated. // #if (defined(__GNUC__) || defined(_MSC_VER) || defined(__clang__)) #define TIME_BUILD_YEAR (__DATE__[7] == '?' ? 1900 \ : (((__DATE__[7] - '0') * 1000 ) \ + (__DATE__[8] - '0') * 100 \ + (__DATE__[9] - '0') * 10 \ + __DATE__[10] - '0')) #define TIME_BUILD_MONTH ( __DATE__ [2] == '?' ? 1 \ : __DATE__ [2] == 'n' ? ( \ __DATE__ [1] == 'a' ? 1 : 6) \ : __DATE__ [2] == 'b' ? 2 \ : __DATE__ [2] == 'r' ? ( \ __DATE__ [0] == 'M' ? 3 : 4) \ : __DATE__ [2] == 'y' ? 5 \ : __DATE__ [2] == 'l' ? 7 \ : __DATE__ [2] == 'g' ? 8 \ : __DATE__ [2] == 'p' ? 9 \ : __DATE__ [2] == 't' ? 10 \ : __DATE__ [2] == 'v' ? 11 \ : 12) #define TIME_BUILD_DAY ( __DATE__[4] == '?' ? 1 \ : ((__DATE__[4] == ' ' ? 0 : \ ((__DATE__[4] - '0') * 10)) \ + __DATE__[5] - '0')) #endif // Define EPOCH (1970-JANUARY-01) in the Julian Date representation #define EPOCH_JULIAN_DATE 2440588 // Seconds per unit #define SEC_PER_MIN ((UINTN) 60) #define SEC_PER_HOUR ((UINTN) 3600) #define SEC_PER_DAY ((UINTN) 86400) /** Check if it is a leap year. @param Time The UEFI time to be checked. @retval TRUE It is a leap year. @retval FALSE It is NOT a leap year. **/ BOOLEAN EFIAPI IsLeapYear ( IN EFI_TIME *Time ); /** Check if the day in the UEFI time is valid. @param Time The UEFI time to be checked. @retval TRUE Valid. @retval FALSE Invalid. **/ BOOLEAN EFIAPI IsDayValid ( IN EFI_TIME *Time ); /** Check if the time zone is valid. Valid values are between -1440 and 1440 or 2047 (EFI_UNSPECIFIED_TIMEZONE). @param TimeZone The time zone to be checked. @retval TRUE Valid. @retval FALSE Invalid. **/ BOOLEAN EFIAPI IsValidTimeZone ( IN INT16 TimeZone ); /** Check if the daylight is valid. Valid values are: 0 : Time is not affected. 1 : Time is affected, and has not been adjusted for daylight savings. 3 : Time is affected, and has been adjusted for daylight savings. All other values are invalid. @param Daylight The daylight to be checked. @retval TRUE Valid. @retval FALSE Invalid. **/ BOOLEAN EFIAPI IsValidDaylight ( IN INT8 Daylight ); /** Check if the UEFI time is valid. @param Time The UEFI time to be checked. @retval TRUE Valid. @retval FALSE Invalid. **/ BOOLEAN EFIAPI IsTimeValid ( IN EFI_TIME *Time ); /** Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to EFI_TIME. @param EpochSeconds Epoch seconds. @param Time The time converted to UEFI format. **/ VOID EFIAPI EpochToEfiTime ( IN UINTN EpochSeconds, OUT EFI_TIME *Time ); /** Converts EFI_TIME to Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC). @param Time The UEFI time to be converted. @return Number of seconds. **/ UINTN EFIAPI EfiTimeToEpoch ( IN EFI_TIME *Time ); /** Get the day of the week from the UEFI time. @param Time The UEFI time to be calculated. @return The day of the week: Sunday=0, Monday=1, ... Saturday=6 **/ UINTN EfiTimeToWday ( IN EFI_TIME *Time ); #endif