2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2008 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
37 /* Concerning times. There are a number of differnt time standards
38 * in Bacula (fdate_t, ftime_t, time_t (Unix standard), btime_t, and
39 * utime_t). fdate_t and ftime_t are deprecated and should no longer
40 * be used, and in general, Unix time time_t should no longer be used,
41 * it is being phased out.
43 * Epoch is the base of Unix time in seconds (time_t, ...)
44 * and is 1 Jan 1970 at 0:0 UTC
46 * The major two times that should be left are:
47 * btime_t (64 bit integer in microseconds base Epoch)
48 * utime_t (64 bit integer in seconds base Epoch)
54 /* Formatted time for user display: dd-Mon-yyyy hh:mm */
55 char *bstrftime(char *dt, int maxlen, utime_t utime)
57 time_t time = (time_t)utime;
60 /* ***FIXME**** the format and localtime_r() should be user configurable */
61 (void)localtime_r(&time, &tm);
62 strftime(dt, maxlen, "%d-%b-%Y %H:%M", &tm);
66 /* Formatted time for user display: dd-Mon-yyyy hh:mm:ss */
67 char *bstrftimes(char *dt, int maxlen, utime_t utime)
69 time_t time = (time_t)utime;
72 /* ***FIXME**** the format and localtime_r() should be user configurable */
73 (void)localtime_r(&time, &tm);
74 strftime(dt, maxlen, "%d-%b-%Y %H:%M:%S", &tm);
79 /* Formatted time for user display: dd-Mon hh:mm */
80 char *bstrftime_ny(char *dt, int maxlen, utime_t utime)
82 time_t time = (time_t)utime;
85 /* ***FIXME**** the format and localtime_r() should be user configurable */
86 (void)localtime_r(&time, &tm);
87 strftime(dt, maxlen, "%d-%b %H:%M", &tm);
92 /* Formatted time for user display: dd-Mon-yy hh:mm (no century) */
93 char *bstrftime_nc(char *dt, int maxlen, utime_t utime)
95 time_t time = (time_t)utime;
99 /* ***FIXME**** the format and localtime_r() should be user configurable */
100 (void)localtime_r(&time, &tm);
101 /* NOTE! since the compiler complains about %y, I use %y and cut the century */
102 strftime(dt, maxlen, "%d-%b-%Y %H:%M", &tm);
103 /* overlay the century */
114 /* Unix time to standard time string yyyy-mm-dd hh:mm:ss */
115 char *bstrutime(char *dt, int maxlen, utime_t utime)
117 time_t time = (time_t)utime;
119 (void)localtime_r(&time, &tm);
120 strftime(dt, maxlen, "%Y-%m-%d %H:%M:%S", &tm);
124 /* Convert standard time string yyyy-mm-dd hh:mm:ss to Unix time */
125 utime_t str_to_utime(char *str)
130 /* Check for bad argument */
131 if (!str || *str == 0) {
135 if (sscanf(str, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
136 &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
144 if (tm.tm_year >= 1900) {
149 tm.tm_wday = tm.tm_yday = 0;
155 return (utime_t)time;
160 * Bacula's time (btime_t) is an unsigned 64 bit integer that contains
161 * the number of microseconds since Epoch Time (1 Jan 1970) UTC.
164 btime_t get_current_btime()
167 if (gettimeofday(&tv, NULL) != 0) {
168 tv.tv_sec = (long)time(NULL); /* fall back to old method */
171 return ((btime_t)tv.tv_sec) * 1000000 + (btime_t)tv.tv_usec;
174 /* Convert btime to Unix time */
175 time_t btime_to_unix(btime_t bt)
177 return (time_t)(bt/1000000);
180 /* Convert btime to utime */
181 utime_t btime_to_utime(btime_t bt)
183 return (utime_t)(bt/1000000);
187 * Return the week of the month, base 0 (wom)
188 * given tm_mday and tm_wday. Value returned
189 * can be from 0 to 4 => week1, ... week5
191 int tm_wom(int mday, int wday)
193 int fs; /* first sunday */
194 fs = (mday%7) - wday;
199 // Dmsg3(100, "mday=%d wom=0 wday=%d <= fs=%d\n", mday, wday, fs);
202 int wom = 1 + (mday - fs - 1) / 7;
203 // Dmsg4(100, "mday=%d wom=%d wday=%d fs=%d\n", mday, wom, wday, fs);
208 * Given a Unix date return the week of the year.
209 * The returned value can be 0-53. Officially
210 * the weeks are numbered from 1 to 53 where week1
211 * is the week in which the first Thursday of the
212 * year occurs (alternatively, the week which contains
213 * the 4th of January). We return 0, if the week of the
214 * year does not fall in the current year.
216 int tm_woy(time_t stime)
218 int woy, fty, tm_yday;
222 memset(&tm, 0, sizeof(struct tm));
223 (void)localtime_r(&stime, &tm);
224 tm_yday = tm.tm_yday;
227 tm.tm_isdst = 0; /* 4 Jan is not DST */
229 (void)localtime_r(&time4, &tm);
230 fty = 1 - tm.tm_wday;
234 woy = tm_yday - fty + 4;
241 /* Deprecated. Do not use. */
242 void get_current_time(struct date_time *dt)
248 (void)gmtime_r(&now, &tm);
249 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,
250 tm.tm_hour, tm.tm_min, tm.tm_sec);
253 Dmsg2(200, "jday=%f jmin=%f\n", dt->julian_day_number, dt->julian_day_fraction);
255 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,
256 tm.tm_hour, tm.tm_min, tm.tm_sec);
261 /* date_encode -- Encode civil date as a Julian day number. */
263 /* Deprecated. Do not use. */
264 fdate_t date_encode(uint32_t year, uint8_t month, uint8_t day)
267 /* Algorithm as given in Meeus, Astronomical Algorithms, Chapter 7, page 61 */
273 ASSERT(day > 0 && day < 32);
283 /* Determine whether date is in Julian or Gregorian calendar based on
284 canonical date of calendar reform. */
286 if ((year < 1582) || ((year == 1582) && ((month < 9) || (month == 9 && day < 5)))) {
289 a = ((int) (y / 100));
293 return (((int32_t) (365.25 * (y + 4716))) + ((int) (30.6001 * (m + 1))) +
297 /* time_encode -- Encode time from hours, minutes, and seconds
298 into a fraction of a day. */
300 /* Deprecated. Do not use. */
301 ftime_t time_encode(uint8_t hour, uint8_t minute, uint8_t second,
302 float32_t second_fraction)
304 ASSERT((second_fraction >= 0.0) || (second_fraction < 1.0));
305 return (ftime_t) (((second + 60L * (minute + 60L * hour)) / 86400.0)) +
309 /* date_time_encode -- Set day number and fraction from date
312 /* Deprecated. Do not use. */
313 void date_time_encode(struct date_time *dt,
314 uint32_t year, uint8_t month, uint8_t day,
315 uint8_t hour, uint8_t minute, uint8_t second,
316 float32_t second_fraction)
318 dt->julian_day_number = date_encode(year, month, day);
319 dt->julian_day_fraction = time_encode(hour, minute, second, second_fraction);
322 /* date_decode -- Decode a Julian day number into civil date. */
324 /* Deprecated. Do not use. */
325 void date_decode(fdate_t date, uint32_t *year, uint8_t *month,
328 fdate_t z, f, a, alpha, b, c, d, e;
337 alpha = floor((z - 1867216.25) / 36524.25);
338 a = z + 1 + alpha - floor(alpha / 4);
342 c = floor((b - 122.1) / 365.25);
343 d = floor(365.25 * c);
344 e = floor((b - d) / 30.6001);
346 *day = (uint8_t) (b - d - floor(30.6001 * e) + f);
347 *month = (uint8_t) ((e < 14) ? (e - 1) : (e - 13));
348 *year = (uint32_t) ((*month > 2) ? (c - 4716) : (c - 4715));
351 /* time_decode -- Decode a day fraction into civil time. */
353 /* Deprecated. Do not use. */
354 void time_decode(ftime_t time, uint8_t *hour, uint8_t *minute,
355 uint8_t *second, float32_t *second_fraction)
359 ij = (uint32_t) ((time - floor(time)) * 86400.0);
360 *hour = (uint8_t) (ij / 3600L);
361 *minute = (uint8_t) ((ij / 60L) % 60L);
362 *second = (uint8_t) (ij % 60L);
363 if (second_fraction != NULL) {
364 *second_fraction = (float32_t)(time - floor(time));
368 /* date_time_decode -- Decode a Julian day and day fraction
369 into civil date and time. */
371 /* Deprecated. Do not use. */
372 void date_time_decode(struct date_time *dt,
373 uint32_t *year, uint8_t *month, uint8_t *day,
374 uint8_t *hour, uint8_t *minute, uint8_t *second,
375 float32_t *second_fraction)
377 date_decode(dt->julian_day_number, year, month, day);
378 time_decode(dt->julian_day_fraction, hour, minute, second, second_fraction);
381 /* tm_encode -- Encode a civil date and time from a tm structure
382 * to a Julian day and day fraction.
385 /* Deprecated. Do not use. */
386 void tm_encode(struct date_time *dt,
390 uint8_t month, day, hour, minute, second;
392 year = tm->tm_year + 1900;
393 month = tm->tm_mon + 1;
398 dt->julian_day_number = date_encode(year, month, day);
399 dt->julian_day_fraction = time_encode(hour, minute, second, 0.0);
403 /* tm_decode -- Decode a Julian day and day fraction
404 into civil date and time in tm structure */
406 /* Deprecated. Do not use. */
407 void tm_decode(struct date_time *dt,
411 uint8_t month, day, hour, minute, second;
413 date_decode(dt->julian_day_number, &year, &month, &day);
414 time_decode(dt->julian_day_fraction, &hour, &minute, &second, NULL);
415 tm->tm_year = year - 1900;
416 tm->tm_mon = month - 1;
424 /* date_time_compare -- Compare two dates and times and return
425 the relationship as follows:
432 /* Deprecated. Do not use. */
433 int date_time_compare(struct date_time *dt1, struct date_time *dt2)
435 if (dt1->julian_day_number == dt2->julian_day_number) {
436 if (dt1->julian_day_fraction == dt2->julian_day_fraction) {
439 return (dt1->julian_day_fraction < dt2->julian_day_fraction) ? -1 : 1;
441 return (dt1->julian_day_number - dt2->julian_day_number) ? -1 : 1;