1 /* datetime.c - Module for common datetime function. */
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2008 Free Software Foundation, Inc.
6 * GRUB is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * GRUB is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
20 #include <grub/datetime.h>
22 static char *grub_weekday_names
[] =
34 grub_get_weekday (struct grub_datetime
*datetime
)
38 a
= (14 - datetime
->month
) / 12;
39 y
= datetime
->year
- a
;
40 m
= datetime
->month
+ 12 * a
- 2;
42 return (datetime
->day
+ y
+ y
/ 4 - y
/ 100 + y
/ 400 + (31 * m
/ 12)) % 7;
46 grub_get_weekday_name (struct grub_datetime
*datetime
)
48 return grub_weekday_names
[grub_get_weekday (datetime
)];
52 #define SECPERHOUR (60*SECPERMIN)
53 #define SECPERDAY (24*SECPERHOUR)
54 #define SECPERYEAR (365*SECPERDAY)
55 #define SECPER4YEARS (4*SECPERYEAR+SECPERDAY)
59 grub_unixtime2datetime (grub_int32_t nix
, struct grub_datetime
*datetime
)
63 grub_uint8_t months
[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
64 /* In the period of validity of unixtime all years divisible by 4
66 /* Convenience: let's have 3 consecutive non-bissextile years
67 at the beginning of the epoch. So count from 1973 instead of 1970 */
68 nix
-= 3*SECPERYEAR
+ SECPERDAY
;
69 /* Transform C divisions and modulos to mathematical ones */
70 div
= nix
/ SECPER4YEARS
;
73 datetime
->year
= 1973 + 4 * div
;
74 nix
-= div
* SECPER4YEARS
;
76 /* On 31st December of bissextile years 365 days from the beginning
77 of the year elapsed but year isn't finished yet */
78 if (nix
/ SECPERYEAR
== 4)
85 datetime
->year
+= nix
/ SECPERYEAR
;
89 && nix
>= ((grub_int32_t
) (i
==1 && datetime
->year
% 4 == 0
90 ? 29 : months
[i
]))*SECPERDAY
; i
++)
91 nix
-= ((grub_int32_t
) (i
==1 && datetime
->year
% 4 == 0
92 ? 29 : months
[i
]))*SECPERDAY
;
93 datetime
->month
= i
+ 1;
94 datetime
->day
= 1 + (nix
/ SECPERDAY
);
96 datetime
->hour
= (nix
/ SECPERHOUR
);
98 datetime
->minute
= nix
/ SECPERMIN
;
99 datetime
->second
= nix
% SECPERMIN
;