]>
Commit | Line | Data |
---|---|---|
05aaebfb | 1 | /* datetime.c - Module for common datetime function. */ |
2 | /* | |
3 | * GRUB -- GRand Unified Bootloader | |
4 | * Copyright (C) 2008 Free Software Foundation, Inc. | |
5 | * | |
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. | |
10 | * | |
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. | |
15 | * | |
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/>. | |
18 | */ | |
19 | ||
20 | #include <grub/datetime.h> | |
21 | ||
22 | static char *grub_weekday_names[] = | |
23 | { | |
24 | "Sunday", | |
25 | "Monday", | |
26 | "Tuesday", | |
27 | "Wednesday", | |
28 | "Thursday", | |
29 | "Friday", | |
30 | "Saturday", | |
31 | }; | |
32 | ||
33 | int | |
34 | grub_get_weekday (struct grub_datetime *datetime) | |
35 | { | |
36 | int a, y, m; | |
37 | ||
38 | a = (14 - datetime->month) / 12; | |
39 | y = datetime->year - a; | |
40 | m = datetime->month + 12 * a - 2; | |
41 | ||
42 | return (datetime->day + y + y / 4 - y / 100 + y / 400 + (31 * m / 12)) % 7; | |
43 | } | |
44 | ||
45 | char * | |
46 | grub_get_weekday_name (struct grub_datetime *datetime) | |
47 | { | |
48 | return grub_weekday_names[grub_get_weekday (datetime)]; | |
49 | } | |
50 | ||
51 | #define SECPERMIN 60 | |
52 | #define SECPERHOUR (60*SECPERMIN) | |
53 | #define SECPERDAY (24*SECPERHOUR) | |
54 | #define SECPERYEAR (365*SECPERDAY) | |
55 | #define SECPER4YEARS (4*SECPERYEAR+SECPERDAY) | |
56 | ||
57 | ||
58 | void | |
59 | grub_unixtime2datetime (grub_int32_t nix, struct grub_datetime *datetime) | |
60 | { | |
61 | int i; | |
62 | int div; | |
b39f9d20 | 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 | |
05aaebfb | 65 | are bissextile*/ |
b39f9d20 | 66 | /* Convenience: let's have 3 consecutive non-bissextile years |
4241d2b1 | 67 | at the beginning of the epoch. So count from 1973 instead of 1970 */ |
05aaebfb | 68 | nix -= 3*SECPERYEAR + SECPERDAY; |
69 | /* Transform C divisions and modulos to mathematical ones */ | |
70 | div = nix / SECPER4YEARS; | |
71 | if (nix < 0) | |
72 | div--; | |
73 | datetime->year = 1973 + 4 * div; | |
74 | nix -= div * SECPER4YEARS; | |
75 | ||
4241d2b1 | 76 | /* On 31st December of bissextile years 365 days from the beginning |
77 | of the year elapsed but year isn't finished yet */ | |
05aaebfb | 78 | if (nix / SECPERYEAR == 4) |
79 | { | |
80 | datetime->year += 3; | |
81 | nix -= 3*SECPERYEAR; | |
82 | } | |
83 | else | |
84 | { | |
85 | datetime->year += nix / SECPERYEAR; | |
86 | nix %= SECPERYEAR; | |
87 | } | |
b39f9d20 | 88 | for (i = 0; i < 12 |
89 | && nix >= ((grub_int32_t) (i==1 && datetime->year % 4 == 0 | |
05aaebfb | 90 | ? 29 : months[i]))*SECPERDAY; i++) |
b39f9d20 | 91 | nix -= ((grub_int32_t) (i==1 && datetime->year % 4 == 0 |
05aaebfb | 92 | ? 29 : months[i]))*SECPERDAY; |
b39f9d20 | 93 | datetime->month = i + 1; |
05aaebfb | 94 | datetime->day = 1 + (nix / SECPERDAY); |
95 | nix %= SECPERDAY; | |
b39f9d20 | 96 | datetime->hour = (nix / SECPERHOUR); |
05aaebfb | 97 | nix %= SECPERHOUR; |
98 | datetime->minute = nix / SECPERMIN; | |
99 | datetime->second = nix % SECPERMIN; | |
100 | } |