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;