root/include/crm/common/iso8601.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /* 
   2  * Copyright (C) 2005 Andrew Beekhof <andrew@beekhof.net>
   3  * 
   4  * This program is free software; you can redistribute it and/or
   5  * modify it under the terms of the GNU Lesser General Public
   6  * License as published by the Free Software Foundation; either
   7  * version 2 of the License, or (at your option) any later version.
   8  * 
   9  * This software is distributed in the hope that it will be useful,
  10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12  * General Public License for more details.
  13  * 
  14  * You should have received a copy of the GNU Lesser General Public
  15  * License along with this library; if not, write to the Free Software
  16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17  */
  18 
  19 /**
  20  * \file
  21  * \brief ISO_8601 Date handling
  22  * \ingroup date
  23  */
  24 
  25 /*
  26  * http://en.wikipedia.org/wiki/ISO_8601
  27  *
  28  */
  29 
  30 #ifndef CRM_COMMON_ISO8601
  31 #  define CRM_COMMON_ISO8601
  32 
  33 #  include <time.h>
  34 #  include <ctype.h>
  35 #  include <stdbool.h>
  36 
  37 typedef struct crm_time_s crm_time_t;
  38 
  39 typedef struct crm_time_period_s {
  40     crm_time_t *start;
  41     crm_time_t *end;
  42     crm_time_t *diff;
  43 } crm_time_period_t;
  44 
  45 /* Creates a new date/time object conforming to iso8601:
  46  *     http://en.wikipedia.org/wiki/ISO_8601
  47  *
  48  * Eg.
  49  *   Ordinal:   2010-01 12:00:00 +10:00
  50  *   Gregorian: 2010-01-01 12:00:00 +10:00
  51  *   ISO Week:  2010-W53-6 12:00:00 +10:00
  52  *
  53  * Notes:
  54  *   Only one of date, time is required
  55  *   If date or timezone is unspecified, they default to the current one
  56  *   Supplying NULL results in the current date/time
  57  *   Dashes may be ommitted from dates
  58  *   Colons may be ommitted from times and timezones
  59  *   A timezone of 'Z' denoted UTC time
  60  */
  61 crm_time_t *crm_time_new(const char *string);
  62 void crm_time_free(crm_time_t * dt);
  63 
  64 char *crm_time_as_string(crm_time_t * dt, int flags);
  65 
  66 #  define crm_time_log(level, prefix, dt, flags) crm_time_log_alias(level, __FILE__, __FUNCTION__, __LINE__, prefix, dt, flags)
  67 void crm_time_log_alias(int log_level, const char *file, const char *function, int line,
  68                         const char *prefix, crm_time_t * date_time, int flags);
  69 
  70 #  define crm_time_log_date          0x001
  71 #  define crm_time_log_timeofday     0x002
  72 #  define crm_time_log_with_timezone 0x004
  73 #  define crm_time_log_duration      0x008
  74 
  75 #  define crm_time_ordinal           0x010
  76 #  define crm_time_weeks             0x020
  77 #  define crm_time_seconds           0x100
  78 #  define crm_time_epoch             0x200
  79 
  80 crm_time_t *crm_time_parse_duration(const char *duration_str);
  81 crm_time_t *crm_time_calculate_duration(crm_time_t * dt, crm_time_t * value);
  82 crm_time_period_t *crm_time_parse_period(const char *period_str);
  83 
  84 int crm_time_compare(crm_time_t * dt, crm_time_t * rhs);
  85 
  86 int crm_time_get_timeofday(crm_time_t * dt, uint32_t * h, uint32_t * m, uint32_t * s);
  87 int crm_time_get_timezone(crm_time_t * dt, uint32_t * h, uint32_t * m);
  88 int crm_time_get_gregorian(crm_time_t * dt, uint32_t * y, uint32_t * m, uint32_t * d);
  89 int crm_time_get_ordinal(crm_time_t * dt, uint32_t * y, uint32_t * d);
  90 int crm_time_get_isoweek(crm_time_t * dt, uint32_t * y, uint32_t * w, uint32_t * d);
  91 
  92 /* Time in seconds since 0000-01-01 00:00:00Z */
  93 long long int crm_time_get_seconds(crm_time_t * dt);
  94 
  95 /* Time in seconds since 1970-01-01 00:00:00Z */
  96 long long int crm_time_get_seconds_since_epoch(crm_time_t * dt);
  97 
  98 void crm_time_set(crm_time_t * target, crm_time_t * source);
  99 void crm_time_set_timet(crm_time_t * target, time_t * source);
 100 
 101 /* Returns a new time object */
 102 crm_time_t *crm_time_add(crm_time_t * dt, crm_time_t * value);
 103 crm_time_t *crm_time_subtract(crm_time_t * dt, crm_time_t * value);
 104 
 105 /* All crm_time_add_... functions support negative values */
 106 void crm_time_add_seconds(crm_time_t * dt, int value);
 107 void crm_time_add_minutes(crm_time_t * dt, int value);
 108 void crm_time_add_hours(crm_time_t * dt, int value);
 109 void crm_time_add_days(crm_time_t * dt, int value);
 110 void crm_time_add_weekdays(crm_time_t * dt, int value);
 111 void crm_time_add_weeks(crm_time_t * dt, int value);
 112 void crm_time_add_months(crm_time_t * dt, int value);
 113 void crm_time_add_years(crm_time_t * dt, int value);
 114 void crm_time_add_ordinalyears(crm_time_t * dt, int value);
 115 void crm_time_add_weekyears(crm_time_t * dt, int value);
 116 
 117 /* Useful helper functions */
 118 int crm_time_january1_weekday(int year);
 119 int crm_time_weeks_in_year(int year);
 120 int crm_time_days_in_month(int month, int year);
 121 
 122 bool crm_time_leapyear(int year);
 123 bool crm_time_check(crm_time_t * dt);
 124 
 125 #endif

/* [previous][next][first][last][top][bottom][index][help] */