| /* |
| * Copyright (C) Tildeslash Ltd. All rights reserved. |
| * |
| * This program is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU Affero General Public License version 3. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Affero General Public License for more details. |
| * |
| * You should have received a copy of the GNU Affero General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| * |
| * In addition, as a special exception, the copyright holders give |
| * permission to link the code of portions of this program with the |
| * OpenSSL library under certain conditions as described in each |
| * individual source file, and distribute linked combinations |
| * including the two. |
| * |
| * You must obey the GNU Affero General Public License in all respects |
| * for all of the code used other than OpenSSL. |
| */ |
| |
| |
| #ifndef TIME_INCLUDED |
| #define TIME_INCLUDED |
| |
| |
| /** |
| * <b>Time</b> is an abstraction of date and time. Time is stored internally |
| * as the number of seconds and microseconds since the epoch, <i>January 1, |
| * 1970 00:00 UTC</i>. |
| * |
| * @see http://www.mmonit.com/ |
| * @file |
| */ |
| |
| |
| /** @name class methods */ |
| //@{ |
| |
| /** |
| * Factory method for building a specific time. Time is normalized and |
| * built in the local time zone. |
| * @param year the year ~ (1970..2037) for this time |
| * @param month the month (January=1..December=12) |
| * @param day the day of the month (1..31) |
| * @param hour the hour (0..23) |
| * @param min the minutes (0..59) |
| * @param sec the seconds of the minute (0..61). Yes, seconds can range |
| * from 0 to 61. This allows the system to inject leap seconds. |
| * @return A time_t representing the specified time |
| * @exception AssertException If a parameter is outside the valid range |
| */ |
| time_t Time_build(int year, int month, int day, int hour, int min, int sec); |
| |
| |
| /** |
| * Parse a Date string and return a <code>time_t</code> representation of |
| * the parsed string. The method parse standard |
| * <a href="ftp://ftp.rfc-editor.org/in-notes/rfc21123.txt">RFC1123</a> |
| * date strings on the format <code>Thu, 17 Oct 2002 19:10:01</code>. Any |
| * permutations of such a string can also be parsed, for example a Unix |
| * date string or a RFC822 date. Any timezone in <code>date</code> is |
| * ignored and the time is parsed using local zone. The following list |
| * show some examples: |
| * <ul> |
| * <li>Fri, 12 Jan 2007 19:10:01</li> |
| * <li>Fri Jan 12 02:29:54 CET 2007</li> |
| * <li>October 17, 2002, time 19:10:01 GMT</li> |
| * <li>/2002/Oct/17</li> |
| * <li>17/Oct/2002</li> |
| * <li>19:10:01 2002 17 Oct</li> |
| * <li>17. October 1970</li> |
| * </ul> |
| * The <a href="ftp://ftp.rfc-editor.org/in-notes/rfc21123.txt">RFC1123</a> |
| * Date String time components: The weekday is a literal |
| * e.g. Thu or Thursday. The weekday component is optional. The month |
| * day is a two digit number, e.g. 17 or 07. The month must be given |
| * as a literal e.g. Oct or October. The year is a four digit number |
| * e.g. 2002. The time is a string with three numbers representing |
| * hours, minutes and seconds. The numbers must be separated with the |
| * ':' character i.e. 19:10:01. Time is optional and if omitted |
| * defaults to 00:00:00. |
| * @param date The date string to parse |
| * @return A time_t representing seconds since the Epoch or -1 if |
| * <code>date</code> cannot be parsed as a Time. |
| */ |
| time_t Time_parse(const char *date); |
| |
| |
| /** |
| * Returns the time since the Epoch (00:00:00 UTC, January 1, 1970), |
| * measured in seconds. |
| * @return A time_t representing the current local time since the epoch |
| * @exception AssertException If time could not be obtained |
| */ |
| time_t Time_now(void); |
| |
| |
| /** |
| * Returns the time since the Epoch (00:00:00 UTC, January 1, 1970), |
| * measured in milliseconds. |
| * @return A 64 bits long representing the current local time since |
| * the epoch in milliseconds |
| * @exception AssertException If time could not be obtained |
| */ |
| long long int Time_milli(void); |
| |
| |
| /** |
| * Converts a local time to the GMT timezone |
| * @param localtime A time_t representing a local time |
| * @return The local time converted to the equivalent GMT timezone |
| */ |
| time_t Time_gmt(time_t localtime); |
| |
| |
| /** |
| * Returns the second of the minute for time. |
| * @param time Number of seconds since the EPOCH |
| * @return The second of the minute (0..61) |
| */ |
| int Time_seconds(time_t time); |
| |
| |
| /** |
| * Returns the minute of the hour for time. |
| * @param time Number of seconds since the EPOCH |
| * @return The minute of the hour (0..59) |
| */ |
| int Time_minutes(time_t time); |
| |
| |
| /** |
| * Returns the hour of the day for time. |
| * @param time Number of seconds since the EPOCH |
| * @return The hour of the day (0..23) |
| */ |
| int Time_hour(time_t time); |
| |
| |
| /** |
| * Returns the day of week expressed as number of days since Sunday. |
| * @param time Number of seconds since the EPOCH |
| * @return The day of the week (Sunday=0..Saturday=6) |
| */ |
| int Time_weekday(time_t time); |
| |
| |
| /** |
| * Returns the day of the month for time. |
| * @param time Number of seconds since the EPOCH |
| * @return The day of the month (1..31) |
| */ |
| int Time_day(time_t time); |
| |
| |
| /** |
| * Returns the month of the year. |
| * @param time Number of seconds since the EPOCH |
| * @return The month of the year (January=1..December=12) |
| */ |
| int Time_month(time_t time); |
| |
| |
| /** |
| * Returns the year of time. |
| * @param time Number of seconds since the EPOCH |
| * @return The year of time in the range ~ (1970..2037) |
| */ |
| int Time_year(time_t time); |
| |
| |
| /** |
| * Add <code>years, months and/or days</code> to this <code>time</code> |
| * (or subtract if <code>years, months and/or days</code> are negative). |
| * @param time time to modify |
| * @param days Number of days to add to time |
| * @param months Number of months to add to time |
| * @param years Number of years to add to time |
| * @return The new time normalized in the local time zone |
| */ |
| time_t Time_add(time_t time, int years, int months, int days); |
| |
| |
| /** |
| * Returns the number of days between <code>to</code> and <code>from</code>. |
| * @param to time |
| * @param from time |
| * @return The difference between <code>from</code> and <code>to</code> |
| * in days. The value is a positive number regardless if <code>to</code> |
| * is earlier or later than <code>from</code>. |
| */ |
| int Time_daysBetween(time_t to, time_t from); |
| |
| |
| /** |
| * Returns a RFC1123 formated date string minus the timezone for the given |
| * time. The returned string is computed in the local timezone. The result |
| * buffer must be large enough to hold at least 26 bytes. Example: |
| * <pre> |
| * Tue, 15 Sep 2009 22:01:25 |
| * </pre> |
| * @param time Number of seconds since the EPOCH |
| * @param result The buffer to write the date string too |
| * @return a pointer to the result buffer |
| */ |
| char *Time_string(time_t time, char result[26]); |
| |
| |
| /** |
| * Returns a RFC1123 formated date string for the given time. <code>time</code> |
| * is <i>converted</i> to UTC (GMT) and the returned string represent the |
| * specified time in UTC. The submitted result buffer must be large enough |
| * to hold at least 30 bytes. Result example: |
| * <pre> |
| * Tue, 15 Sep 2009 22:01:25 GMT |
| * </pre> |
| * @param time Number of localtime seconds since the EPOCH |
| * @param result The buffer to write the date string too |
| * @return a pointer to the result buffer |
| */ |
| char *Time_gmtstring(time_t time, char result[30]); |
| |
| |
| /** |
| * Returns <code>time</code> as a date string. The <code>format</code> |
| * parameter determines the format of the string. The format specifiers |
| * are the same as those used by <code>strftime(3)</code>. For instance to |
| * specify a RFC822 time string on the format "Wed, 05 Feb 2003 01:16:44 |
| * +0100" the following format string is used: |
| * <code>"%a, %d %b %Y %H:%M:%S %z"</code> |
| * @param result The buffer to write the date string too |
| * @param size Size of the result buffer |
| * @param format A <code>strftime</code> format string |
| * @param time Number of seconds since the EPOCH |
| * @return A pointer to the result buffer |
| * @exception AssertException If <code>format</code> or <code>result</code> |
| * is NULL |
| */ |
| char *Time_fmt(char *result, int size, const char *format, time_t time); |
| |
| |
| /** |
| * Returns a uptime formated string for the given seconds. That is, convert |
| * <code>sec</code> to days, hours and minutes and return a string on the |
| * form, <code>7d, 17h, 34m</code>. The submitted result buffer must be |
| * large enough to hold at least 24 bytes. |
| * @param sec Number of seconds to split up into, days, hours, minutes and |
| * seconds. |
| * @param result The buffer to write the uptime string too |
| * @return a pointer to the result buffer or NULL if <code>result</code> |
| * was NULL |
| */ |
| char *Time_uptime(time_t sec, char result[24]); |
| |
| |
| /** |
| * Returns 1 if the given time is in the range of the specified cron |
| * format string, otherwise 0. The cron string consists of 5 fields separated |
| * with white-space. All fields are required: |
| * |
| * <table> |
| * <tr> |
| * <th>Name</th> |
| * <th>Allowed values</th> |
| * <th>Special characters</th> |
| * </tr> |
| * <tr> |
| * <td>Minutes</td> |
| * <td>0-59</td> |
| * <td>* , -</td> |
| * </tr> |
| * <tr> |
| * <td>Hours</td> |
| * <td>0-23</td> |
| * <td>* , -</td> |
| * </tr> |
| * <tr> |
| * <td>Day of month</td> |
| * <td>1-31</td> |
| * <td>* , -</td> |
| * </tr> |
| * <tr> |
| * <td>Month</td> |
| * <td>1-12 (1=jan, 12=dec)</td> |
| * <td>* , -</td> |
| * </tr> |
| * <tr> |
| * <td>Day of week</td> |
| * <td>0-6 (0=sunday, 6=saturday)</td> |
| * <td>* , -</td> |
| * </tr> |
| * </table> |
| * <h3>Special characters</h3> |
| * <ul> |
| * <li>* The asterisk indicates that the expression will match |
| * for all values of the field; e.g., using an asterisk in the 4th |
| * field (month) would indicate every month. |
| * <li>- (hyphen) Hyphens are used to define ranges. For example, |
| * 8-9 in the hour field indicate between 8AM and 9AM. Note that |
| * range is from time1 until and including time2. That is, from 8AM |
| * and until 10AM unless minutes are set. Another example, 1-5 in the |
| * weekday field, specify from monday to friday (including friday). |
| * <li>, (comma) Comma are used to specify a sequence. For example, |
| * 17,18 in the day field indicate the 17th and 18th day of the month. |
| * A sequence can also include ranges. For example, using |
| * 1-5,0 in the weekday field indicate monday to friday and sunday. |
| * </ul> |
| * <h3>Example</h3> |
| * <ul> |
| * <li><code>"* 9-10 * * 1-5"</code> Matches 9AM-10AM every weekday |
| * <li><code>"* 0-5,23 * * 0,6"</code> Matches between 0AM-5AM and 11PM each saturday and sunday |
| * </ul> |
| * @param cron A crontab format string. e.g. "* 8-9 * * *" |
| * @param time The time to test if in range of the cron format |
| * @return 1 if time is in cron range, otherwise 0. |
| */ |
| int Time_incron(const char *cron, time_t time); |
| |
| |
| /** |
| * This method suspend the calling process or Thread for |
| * <code>u</code> micro seconds. |
| * @param u Micro seconds to sleep |
| */ |
| void Time_usleep(long u); |
| |
| //@} |
| |
| #undef T |
| #endif |