3 * Copyright (c) 2016, Hisilicon Limited. All rights reserved.
4 * Copyright (c) 2016-2019, Linaro Limited. All rights reserved.
6 * SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include <Uefi/UefiBaseType.h>
11 #include <Uefi/UefiSpec.h>
12 #include <Library/DebugLib.h>
13 #include <Library/TimeBaseLib.h>
16 Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to EFI_TIME
21 IN UINTN EpochSeconds
,
42 J
= (EpochSeconds
/ 86400) + 2440588;
46 c
= (((dg
/ 36524) + 1) * 3) / 4;
47 dc
= dg
- (c
* 36524);
50 a
= (((db
/ 365) + 1) * 3) / 4;
52 y
= (g
* 400) + (c
* 100) + (b
* 4) + a
;
53 m
= (((da
* 5) + 308) / 153) - 2;
54 d
= da
- (((m
+ 4) * 153) / 5) + 122;
56 Time
->Year
= (UINT16
)(y
- 4800 + ((m
+ 2) / 12));
57 Time
->Month
= ((m
+ 2) % 12) + 1;
58 Time
->Day
= (UINT8
)(d
+ 1);
60 ss
= EpochSeconds
% 60;
61 a
= (EpochSeconds
- ss
) / 60;
66 Time
->Hour
= (UINT8
)hh
;
67 Time
->Minute
= (UINT8
)mm
;
68 Time
->Second
= (UINT8
)ss
;
85 UINTN JulianDate
; // Absolute Julian Date representation of the supplied Time
86 UINTN EpochDays
; // Number of days elapsed since EPOCH_JULIAN_DAY
88 a
= (14 - Time
->Month
) / 12 ;
89 y
= Time
->Year
+ 4800 - a
;
90 m
= Time
->Month
+ (12*a
) - 3;
92 JulianDate
= Time
->Day
+ ((153*m
+ 2)/5) + (365*y
) + (y
/4) - (y
/100) + (y
/400) - 32045;
94 ASSERT (JulianDate
>= EPOCH_JULIAN_DATE
);
95 EpochDays
= JulianDate
- EPOCH_JULIAN_DATE
;
100 Converts EFI_TIME to Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC)
108 UINTN EpochDays
; // Number of days elapsed since EPOCH_JULIAN_DAY
111 EpochDays
= EfiGetEpochDays (Time
);
113 EpochSeconds
= (EpochDays
* SEC_PER_DAY
) + ((UINTN
)Time
->Hour
* SEC_PER_HOUR
) + (Time
->Minute
* SEC_PER_MIN
) + Time
->Second
;
119 returns Day of the week [0-6] 0=Sunday
126 UINTN EpochDays
; // Number of days elapsed since EPOCH_JULIAN_DAY
128 EpochDays
= EfiGetEpochDays (Time
);
130 // 4=1/1/1970 was a Thursday
132 return (EpochDays
+ 4) % 7;
141 if (Time
->Year
% 4 == 0) {
142 if (Time
->Year
% 100 == 0) {
143 if (Time
->Year
% 400 == 0) {
162 STATIC CONST INTN DayOfMonth
[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
165 Time
->Day
> DayOfMonth
[Time
->Month
- 1] ||
166 (Time
->Month
== 2 && (!IsLeapYear (Time
) && Time
->Day
> 28))
180 // Check the input parameters are within the range specified by UEFI
181 if ((Time
->Year
< 2000) ||
182 (Time
->Year
> 2099) ||
183 (Time
->Month
< 1 ) ||
184 (Time
->Month
> 12 ) ||
185 (!IsDayValid (Time
) ) ||
186 (Time
->Hour
> 23 ) ||
187 (Time
->Minute
> 59 ) ||
188 (Time
->Second
> 59 ) ||
189 (Time
->Nanosecond
> 999999999) ||
190 (!((Time
->TimeZone
== EFI_UNSPECIFIED_TIMEZONE
) || ((Time
->TimeZone
>= -1440) && (Time
->TimeZone
<= 1440)))) ||
191 (Time
->Daylight
& (~(EFI_TIME_ADJUST_DAYLIGHT
| EFI_TIME_IN_DAYLIGHT
)))