TimeBaseLib.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /** @file
  2. *
  3. * Copyright (c) 2016, Hisilicon Limited. All rights reserved.
  4. * Copyright (c) 2016-2019, Linaro Limited. All rights reserved.
  5. * Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
  6. *
  7. * SPDX-License-Identifier: BSD-2-Clause-Patent
  8. *
  9. **/
  10. #ifndef _TIME_BASE_LIB_H_
  11. #define _TIME_BASE_LIB_H_
  12. #include <Uefi/UefiBaseType.h>
  13. //
  14. // Convenience macros to obtain a build date
  15. //
  16. // These macros should work for any compiler that follows ISO/IEC 9899,
  17. // in which case __DATE__ is defined as a "Mmm dd yyyy" 11 chars string,
  18. // but add an explicit filter for compilers that have been validated.
  19. //
  20. #if (defined (__GNUC__) || defined (_MSC_VER) || defined (__clang__))
  21. #define TIME_BUILD_YEAR (__DATE__[7] == '?' ? 1900\
  22. : (((__DATE__[7] - '0') * 1000 ) \
  23. + (__DATE__[8] - '0') * 100 \
  24. + (__DATE__[9] - '0') * 10 \
  25. + __DATE__[10] - '0'))
  26. #define TIME_BUILD_MONTH ( __DATE__ [2] == '?' ? 1 \
  27. : __DATE__ [2] == 'n' ? ( \
  28. __DATE__ [1] == 'a' ? 1 : 6) \
  29. : __DATE__ [2] == 'b' ? 2 \
  30. : __DATE__ [2] == 'r' ? ( \
  31. __DATE__ [0] == 'M' ? 3 : 4) \
  32. : __DATE__ [2] == 'y' ? 5 \
  33. : __DATE__ [2] == 'l' ? 7 \
  34. : __DATE__ [2] == 'g' ? 8 \
  35. : __DATE__ [2] == 'p' ? 9 \
  36. : __DATE__ [2] == 't' ? 10 \
  37. : __DATE__ [2] == 'v' ? 11 \
  38. : 12)
  39. #define TIME_BUILD_DAY ( __DATE__[4] == '?' ? 1 \
  40. : ((__DATE__[4] == ' ' ? 0 : \
  41. ((__DATE__[4] - '0') * 10)) \
  42. + __DATE__[5] - '0'))
  43. #endif
  44. // Define EPOCH (1970-JANUARY-01) in the Julian Date representation
  45. #define EPOCH_JULIAN_DATE 2440588
  46. // Seconds per unit
  47. #define SEC_PER_MIN ((UINTN) 60)
  48. #define SEC_PER_HOUR ((UINTN) 3600)
  49. #define SEC_PER_DAY ((UINTN) 86400)
  50. /**
  51. Check if it is a leap year.
  52. @param Time The UEFI time to be checked.
  53. @retval TRUE It is a leap year.
  54. @retval FALSE It is NOT a leap year.
  55. **/
  56. BOOLEAN
  57. EFIAPI
  58. IsLeapYear (
  59. IN EFI_TIME *Time
  60. );
  61. /**
  62. Check if the day in the UEFI time is valid.
  63. @param Time The UEFI time to be checked.
  64. @retval TRUE Valid.
  65. @retval FALSE Invalid.
  66. **/
  67. BOOLEAN
  68. EFIAPI
  69. IsDayValid (
  70. IN EFI_TIME *Time
  71. );
  72. /**
  73. Check if the time zone is valid.
  74. Valid values are between -1440 and 1440 or 2047 (EFI_UNSPECIFIED_TIMEZONE).
  75. @param TimeZone The time zone to be checked.
  76. @retval TRUE Valid.
  77. @retval FALSE Invalid.
  78. **/
  79. BOOLEAN
  80. EFIAPI
  81. IsValidTimeZone (
  82. IN INT16 TimeZone
  83. );
  84. /**
  85. Check if the daylight is valid.
  86. Valid values are:
  87. 0 : Time is not affected.
  88. 1 : Time is affected, and has not been adjusted for daylight savings.
  89. 3 : Time is affected, and has been adjusted for daylight savings.
  90. All other values are invalid.
  91. @param Daylight The daylight to be checked.
  92. @retval TRUE Valid.
  93. @retval FALSE Invalid.
  94. **/
  95. BOOLEAN
  96. EFIAPI
  97. IsValidDaylight (
  98. IN INT8 Daylight
  99. );
  100. /**
  101. Check if the UEFI time is valid.
  102. @param Time The UEFI time to be checked.
  103. @retval TRUE Valid.
  104. @retval FALSE Invalid.
  105. **/
  106. BOOLEAN
  107. EFIAPI
  108. IsTimeValid (
  109. IN EFI_TIME *Time
  110. );
  111. /**
  112. Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to EFI_TIME.
  113. @param EpochSeconds Epoch seconds.
  114. @param Time The time converted to UEFI format.
  115. **/
  116. VOID
  117. EFIAPI
  118. EpochToEfiTime (
  119. IN UINTN EpochSeconds,
  120. OUT EFI_TIME *Time
  121. );
  122. /**
  123. Converts EFI_TIME to Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC).
  124. @param Time The UEFI time to be converted.
  125. @return Number of seconds.
  126. **/
  127. UINTN
  128. EFIAPI
  129. EfiTimeToEpoch (
  130. IN EFI_TIME *Time
  131. );
  132. /**
  133. Get the day of the week from the UEFI time.
  134. @param Time The UEFI time to be calculated.
  135. @return The day of the week: Sunday=0, Monday=1, ... Saturday=6
  136. **/
  137. UINTN
  138. EfiTimeToWday (
  139. IN EFI_TIME *Time
  140. );
  141. #endif