2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2011 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version three of the GNU Affero General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU Affero General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
29 * Bacula floating point time and date routines -- John Walker
31 * Later double precision integer time/date routines -- Kern Sibbald
36 /* Concerning times. There are a number of differnt time standards
37 * in Bacula (fdate_t, ftime_t, time_t (Unix standard), btime_t, and
38 * utime_t). fdate_t and ftime_t are deprecated and should no longer
39 * be used, and in general, Unix time time_t should no longer be used,
40 * it is being phased out.
42 * Epoch is the base of Unix time in seconds (time_t, ...)
43 * and is 1 Jan 1970 at 0:0 UTC
45 * The major two times that should be left are:
46 * btime_t (64 bit integer in microseconds base Epoch)
47 * utime_t (64 bit integer in seconds base Epoch)
53 /* Formatted time for user display: dd-Mon-yyyy hh:mm */
54 char *bstrftime(char *dt, int maxlen, utime_t utime)
56 time_t time = (time_t)utime;
59 /* ***FIXME**** the format and localtime_r() should be user configurable */
60 (void)localtime_r(&time, &tm);
61 strftime(dt, maxlen, "%d-%b-%Y %H:%M", &tm);
65 /* Formatted time for user display: dd-Mon-yyyy hh:mm:ss */
66 char *bstrftimes(char *dt, int maxlen, utime_t utime)
68 time_t time = (time_t)utime;
71 /* ***FIXME**** the format and localtime_r() should be user configurable */
72 (void)localtime_r(&time, &tm);
73 strftime(dt, maxlen, "%d-%b-%Y %H:%M:%S", &tm);
78 /* Formatted time for user display: dd-Mon hh:mm */
79 char *bstrftime_ny(char *dt, int maxlen, utime_t utime)
81 time_t time = (time_t)utime;
84 /* ***FIXME**** the format and localtime_r() should be user configurable */
85 (void)localtime_r(&time, &tm);
86 strftime(dt, maxlen, "%d-%b %H:%M", &tm);
91 /* Formatted time for user display: dd-Mon-yy hh:mm (no century) */
92 char *bstrftime_nc(char *dt, int maxlen, utime_t utime)
94 time_t time = (time_t)utime;
98 /* ***FIXME**** the format and localtime_r() should be user configurable */
99 (void)localtime_r(&time, &tm);
100 /* NOTE! since the compiler complains about %y, I use %y and cut the century */
101 strftime(dt, maxlen, "%d-%b-%Y %H:%M", &tm);
102 /* overlay the century */
113 /* Unix time to standard time string yyyy-mm-dd hh:mm:ss */
114 char *bstrutime(char *dt, int maxlen, utime_t utime)
116 time_t time = (time_t)utime;
118 (void)localtime_r(&time, &tm);
119 strftime(dt, maxlen, "%Y-%m-%d %H:%M:%S", &tm);
123 /* Convert standard time string yyyy-mm-dd hh:mm:ss to Unix time */
124 utime_t str_to_utime(char *str)
129 /* Check for bad argument */
130 if (!str || *str == 0) {
134 if (sscanf(str, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
135 &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
143 if (tm.tm_year >= 1900) {
148 tm.tm_wday = tm.tm_yday = 0;
154 return (utime_t)time;
159 * Bacula's time (btime_t) is an unsigned 64 bit integer that contains
160 * the number of microseconds since Epoch Time (1 Jan 1970) UTC.
163 btime_t get_current_btime()
166 if (gettimeofday(&tv, NULL) != 0) {
167 tv.tv_sec = (long)time(NULL); /* fall back to old method */
170 return ((btime_t)tv.tv_sec) * 1000000 + (btime_t)tv.tv_usec;
173 /* Convert btime to Unix time */
174 time_t btime_to_unix(btime_t bt)
176 return (time_t)(bt/1000000);
179 /* Convert btime to utime */
180 utime_t btime_to_utime(btime_t bt)
182 return (utime_t)(bt/1000000);
186 * Return the week of the month, base 0 (wom)
187 * given tm_mday and tm_wday. Value returned
188 * can be from 0 to 4 => week1, ... week5
190 int tm_wom(int mday, int wday)
192 int fs; /* first sunday */
193 fs = (mday%7) - wday;
198 // Dmsg3(100, "mday=%d wom=0 wday=%d <= fs=%d\n", mday, wday, fs);
201 int wom = 1 + (mday - fs - 1) / 7;
202 // Dmsg4(100, "mday=%d wom=%d wday=%d fs=%d\n", mday, wom, wday, fs);
207 * Given a Unix date return the week of the year.
208 * The returned value can be 0-53. Officially
209 * the weeks are numbered from 1 to 53 where week1
210 * is the week in which the first Thursday of the
211 * year occurs (alternatively, the week which contains
212 * the 4th of January). We return 0, if the week of the
213 * year does not fall in the current year.
215 int tm_woy(time_t stime)
217 int woy, fty, tm_yday;
221 memset(&tm, 0, sizeof(struct tm));
222 (void)localtime_r(&stime, &tm);
223 tm_yday = tm.tm_yday;
226 tm.tm_isdst = 0; /* 4 Jan is not DST */
228 (void)localtime_r(&time4, &tm);
229 fty = 1 - tm.tm_wday;
233 woy = tm_yday - fty + 4;
240 /* Deprecated. Do not use. */
241 void get_current_time(struct date_time *dt)
247 (void)gmtime_r(&now, &tm);
248 Dmsg6(200, "m=%d d=%d y=%d h=%d m=%d s=%d\n", tm.tm_mon+1, tm.tm_mday, tm.tm_year+1900,
249 tm.tm_hour, tm.tm_min, tm.tm_sec);
252 Dmsg2(200, "jday=%f jmin=%f\n", dt->julian_day_number, dt->julian_day_fraction);
254 Dmsg6(200, "m=%d d=%d y=%d h=%d m=%d s=%d\n", tm.tm_mon+1, tm.tm_mday, tm.tm_year+1900,
255 tm.tm_hour, tm.tm_min, tm.tm_sec);
260 /* date_encode -- Encode civil date as a Julian day number. */
262 /* Deprecated. Do not use. */
263 fdate_t date_encode(uint32_t year, uint8_t month, uint8_t day)
266 /* Algorithm as given in Meeus, Astronomical Algorithms, Chapter 7, page 61 */
272 ASSERT(day > 0 && day < 32);
282 /* Determine whether date is in Julian or Gregorian calendar based on
283 canonical date of calendar reform. */
285 if ((year < 1582) || ((year == 1582) && ((month < 9) || (month == 9 && day < 5)))) {
288 a = ((int) (y / 100));
292 return (((int32_t) (365.25 * (y + 4716))) + ((int) (30.6001 * (m + 1))) +
296 /* time_encode -- Encode time from hours, minutes, and seconds
297 into a fraction of a day. */
299 /* Deprecated. Do not use. */
300 ftime_t time_encode(uint8_t hour, uint8_t minute, uint8_t second,
301 float32_t second_fraction)
303 ASSERT((second_fraction >= 0.0) || (second_fraction < 1.0));
304 return (ftime_t) (((second + 60L * (minute + 60L * hour)) / 86400.0)) +
308 /* date_time_encode -- Set day number and fraction from date
311 /* Deprecated. Do not use. */
312 void date_time_encode(struct date_time *dt,
313 uint32_t year, uint8_t month, uint8_t day,
314 uint8_t hour, uint8_t minute, uint8_t second,
315 float32_t second_fraction)
317 dt->julian_day_number = date_encode(year, month, day);
318 dt->julian_day_fraction = time_encode(hour, minute, second, second_fraction);
321 /* date_decode -- Decode a Julian day number into civil date. */
323 /* Deprecated. Do not use. */
324 void date_decode(fdate_t date, uint32_t *year, uint8_t *month,
327 fdate_t z, f, a, alpha, b, c, d, e;
336 alpha = floor((z - 1867216.25) / 36524.25);
337 a = z + 1 + alpha - floor(alpha / 4);
341 c = floor((b - 122.1) / 365.25);
342 d = floor(365.25 * c);
343 e = floor((b - d) / 30.6001);
345 *day = (uint8_t) (b - d - floor(30.6001 * e) + f);
346 *month = (uint8_t) ((e < 14) ? (e - 1) : (e - 13));
347 *year = (uint32_t) ((*month > 2) ? (c - 4716) : (c - 4715));
350 /* time_decode -- Decode a day fraction into civil time. */
352 /* Deprecated. Do not use. */
353 void time_decode(ftime_t time, uint8_t *hour, uint8_t *minute,
354 uint8_t *second, float32_t *second_fraction)
358 ij = (uint32_t) ((time - floor(time)) * 86400.0);
359 *hour = (uint8_t) (ij / 3600L);
360 *minute = (uint8_t) ((ij / 60L) % 60L);
361 *second = (uint8_t) (ij % 60L);
362 if (second_fraction != NULL) {
363 *second_fraction = (float32_t)(time - floor(time));
367 /* date_time_decode -- Decode a Julian day and day fraction
368 into civil date and time. */
370 /* Deprecated. Do not use. */
371 void date_time_decode(struct date_time *dt,
372 uint32_t *year, uint8_t *month, uint8_t *day,
373 uint8_t *hour, uint8_t *minute, uint8_t *second,
374 float32_t *second_fraction)
376 date_decode(dt->julian_day_number, year, month, day);
377 time_decode(dt->julian_day_fraction, hour, minute, second, second_fraction);
380 /* tm_encode -- Encode a civil date and time from a tm structure
381 * to a Julian day and day fraction.
384 /* Deprecated. Do not use. */
385 void tm_encode(struct date_time *dt,
389 uint8_t month, day, hour, minute, second;
391 year = tm->tm_year + 1900;
392 month = tm->tm_mon + 1;
397 dt->julian_day_number = date_encode(year, month, day);
398 dt->julian_day_fraction = time_encode(hour, minute, second, 0.0);
402 /* tm_decode -- Decode a Julian day and day fraction
403 into civil date and time in tm structure */
405 /* Deprecated. Do not use. */
406 void tm_decode(struct date_time *dt,
410 uint8_t month, day, hour, minute, second;
412 date_decode(dt->julian_day_number, &year, &month, &day);
413 time_decode(dt->julian_day_fraction, &hour, &minute, &second, NULL);
414 tm->tm_year = year - 1900;
415 tm->tm_mon = month - 1;
423 /* date_time_compare -- Compare two dates and times and return
424 the relationship as follows:
431 /* Deprecated. Do not use. */
432 int date_time_compare(struct date_time *dt1, struct date_time *dt2)
434 if (dt1->julian_day_number == dt2->julian_day_number) {
435 if (dt1->julian_day_fraction == dt2->julian_day_fraction) {
438 return (dt1->julian_day_fraction < dt2->julian_day_fraction) ? -1 : 1;
440 return (dt1->julian_day_number - dt2->julian_day_number) ? -1 : 1;