|
|
1.1 ! root 1: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ! 2: /* ! 3: * The contents of this file are subject to the Mozilla Public ! 4: * License Version 1.1 (the "License"); you may not use this file ! 5: * except in compliance with the License. You may obtain a copy of ! 6: * the License at http://www.mozilla.org/MPL/ ! 7: * ! 8: * Software distributed under the License is distributed on an "AS ! 9: * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ! 10: * implied. See the License for the specific language governing ! 11: * rights and limitations under the License. ! 12: * ! 13: * The Original Code is the Netscape Portable Runtime (NSPR). ! 14: * ! 15: * The Initial Developer of the Original Code is Netscape ! 16: * Communications Corporation. Portions created by Netscape are ! 17: * Copyright (C) 1998-2000 Netscape Communications Corporation. All ! 18: * Rights Reserved. ! 19: * ! 20: * Contributor(s): ! 21: * ! 22: * Alternatively, the contents of this file may be used under the ! 23: * terms of the GNU General Public License Version 2 or later (the ! 24: * "GPL"), in which case the provisions of the GPL are applicable ! 25: * instead of those above. If you wish to allow use of your ! 26: * version of this file only under the terms of the GPL and not to ! 27: * allow others to use your version of this file under the MPL, ! 28: * indicate your decision by deleting the provisions above and ! 29: * replace them with the notice and other provisions required by ! 30: * the GPL. If you do not delete the provisions above, a recipient ! 31: * may use your version of this file under either the MPL or the ! 32: * GPL. ! 33: */ ! 34: ! 35: /* ! 36: *---------------------------------------------------------------------- ! 37: * ! 38: * prtime.h -- ! 39: * ! 40: * NSPR date and time functions ! 41: * ! 42: *----------------------------------------------------------------------- ! 43: */ ! 44: ! 45: #ifndef prtime_h___ ! 46: #define prtime_h___ ! 47: ! 48: #include "prlong.h" ! 49: ! 50: PR_BEGIN_EXTERN_C ! 51: ! 52: /**********************************************************************/ ! 53: /************************* TYPES AND CONSTANTS ************************/ ! 54: /**********************************************************************/ ! 55: ! 56: #define PR_MSEC_PER_SEC 1000UL ! 57: #define PR_USEC_PER_SEC 1000000UL ! 58: #define PR_NSEC_PER_SEC 1000000000UL ! 59: #define PR_USEC_PER_MSEC 1000UL ! 60: #define PR_NSEC_PER_MSEC 1000000UL ! 61: ! 62: /* ! 63: * PRTime -- ! 64: * ! 65: * NSPR represents basic time as 64-bit signed integers relative ! 66: * to midnight (00:00:00), January 1, 1970 Greenwich Mean Time (GMT). ! 67: * (GMT is also known as Coordinated Universal Time, UTC.) ! 68: * The units of time are in microseconds. Negative times are allowed ! 69: * to represent times prior to the January 1970 epoch. Such values are ! 70: * intended to be exported to other systems or converted to human ! 71: * readable form. ! 72: * ! 73: * Notes on porting: PRTime corresponds to time_t in ANSI C. NSPR 1.0 ! 74: * simply uses PRInt64. ! 75: */ ! 76: ! 77: typedef PRInt64 PRTime; ! 78: ! 79: /* ! 80: * Time zone and daylight saving time corrections applied to GMT to ! 81: * obtain the local time of some geographic location ! 82: */ ! 83: ! 84: typedef struct PRTimeParameters { ! 85: PRInt32 tp_gmt_offset; /* the offset from GMT in seconds */ ! 86: PRInt32 tp_dst_offset; /* contribution of DST in seconds */ ! 87: } PRTimeParameters; ! 88: ! 89: /* ! 90: * PRExplodedTime -- ! 91: * ! 92: * Time broken down into human-readable components such as year, month, ! 93: * day, hour, minute, second, and microsecond. Time zone and daylight ! 94: * saving time corrections may be applied. If they are applied, the ! 95: * offsets from the GMT must be saved in the 'tm_params' field so that ! 96: * all the information is available to reconstruct GMT. ! 97: * ! 98: * Notes on porting: PRExplodedTime corrresponds to struct tm in ! 99: * ANSI C, with the following differences: ! 100: * - an additional field tm_usec; ! 101: * - replacing tm_isdst by tm_params; ! 102: * - the month field is spelled tm_month, not tm_mon; ! 103: * - we use absolute year, AD, not the year since 1900. ! 104: * The corresponding type in NSPR 1.0 is called PRTime. Below is ! 105: * a table of date/time type correspondence in the three APIs: ! 106: * API time since epoch time in components ! 107: * ANSI C time_t struct tm ! 108: * NSPR 1.0 PRInt64 PRTime ! 109: * NSPR 2.0 PRTime PRExplodedTime ! 110: */ ! 111: ! 112: typedef struct PRExplodedTime { ! 113: PRInt32 tm_usec; /* microseconds past tm_sec (0-99999) */ ! 114: PRInt32 tm_sec; /* seconds past tm_min (0-61, accomodating ! 115: up to two leap seconds) */ ! 116: PRInt32 tm_min; /* minutes past tm_hour (0-59) */ ! 117: PRInt32 tm_hour; /* hours past tm_day (0-23) */ ! 118: PRInt32 tm_mday; /* days past tm_mon (1-31, note that it ! 119: starts from 1) */ ! 120: PRInt32 tm_month; /* months past tm_year (0-11, Jan = 0) */ ! 121: PRInt16 tm_year; /* absolute year, AD (note that we do not ! 122: count from 1900) */ ! 123: ! 124: PRInt8 tm_wday; /* calculated day of the week ! 125: (0-6, Sun = 0) */ ! 126: PRInt16 tm_yday; /* calculated day of the year ! 127: (0-365, Jan 1 = 0) */ ! 128: ! 129: PRTimeParameters tm_params; /* time parameters used by conversion */ ! 130: } PRExplodedTime; ! 131: ! 132: /* ! 133: * PRTimeParamFn -- ! 134: * ! 135: * A function of PRTimeParamFn type returns the time zone and ! 136: * daylight saving time corrections for some geographic location, ! 137: * given the current time in GMT. The input argument gmt should ! 138: * point to a PRExplodedTime that is in GMT, i.e., whose ! 139: * tm_params contains all 0's. ! 140: * ! 141: * For any time zone other than GMT, the computation is intended to ! 142: * consist of two steps: ! 143: * - Figure out the time zone correction, tp_gmt_offset. This number ! 144: * usually depends on the geographic location only. But it may ! 145: * also depend on the current time. For example, all of China ! 146: * is one time zone right now. But this situation may change ! 147: * in the future. ! 148: * - Figure out the daylight saving time correction, tp_dst_offset. ! 149: * This number depends on both the geographic location and the ! 150: * current time. Most of the DST rules are expressed in local ! 151: * current time. If so, one should apply the time zone correction ! 152: * to GMT before applying the DST rules. ! 153: */ ! 154: ! 155: typedef PRTimeParameters (PR_CALLBACK *PRTimeParamFn)(const PRExplodedTime *gmt); ! 156: ! 157: /**********************************************************************/ ! 158: /****************************** FUNCTIONS *****************************/ ! 159: /**********************************************************************/ ! 160: ! 161: /* ! 162: * The PR_Now routine returns the current time relative to the ! 163: * epoch, midnight, January 1, 1970 UTC. The units of the returned ! 164: * value are microseconds since the epoch. ! 165: * ! 166: * The values returned are not guaranteed to advance in a linear fashion ! 167: * due to the application of time correction protocols which synchronize ! 168: * computer clocks to some external time source. Consequently it should ! 169: * not be depended on for interval timing. ! 170: * ! 171: * The implementation is machine dependent. ! 172: * Cf. time_t time(time_t *tp) in ANSI C. ! 173: */ ! 174: #if defined(HAVE_WATCOM_BUG_2) ! 175: PRTime __pascal __export __loadds ! 176: #else ! 177: NSPR_API(PRTime) ! 178: #endif ! 179: PR_Now(void); ! 180: ! 181: /* ! 182: * Expand time binding it to time parameters provided by PRTimeParamFn. ! 183: * The calculation is envisoned to proceed in the following steps: ! 184: * - From given PRTime, calculate PRExplodedTime in GMT ! 185: * - Apply the given PRTimeParamFn to the GMT that we just calculated ! 186: * to obtain PRTimeParameters. ! 187: * - Add the PRTimeParameters offsets to GMT to get the local time ! 188: * as PRExplodedTime. ! 189: */ ! 190: ! 191: NSPR_API(void) PR_ExplodeTime( ! 192: PRTime usecs, PRTimeParamFn params, PRExplodedTime *exploded); ! 193: ! 194: /* Reverse operation of PR_ExplodeTime */ ! 195: #if defined(HAVE_WATCOM_BUG_2) ! 196: PRTime __pascal __export __loadds ! 197: #else ! 198: NSPR_API(PRTime) ! 199: #endif ! 200: PR_ImplodeTime(const PRExplodedTime *exploded); ! 201: ! 202: /* ! 203: * Adjust exploded time to normalize field overflows after manipulation. ! 204: * Note that the following fields of PRExplodedTime should not be ! 205: * manipulated: ! 206: * - tm_month and tm_year: because the number of days in a month and ! 207: * number of days in a year are not constant, it is ambiguous to ! 208: * manipulate the month and year fields, although one may be tempted ! 209: * to. For example, what does "a month from January 31st" mean? ! 210: * - tm_wday and tm_yday: these fields are calculated by NSPR. Users ! 211: * should treat them as "read-only". ! 212: */ ! 213: ! 214: NSPR_API(void) PR_NormalizeTime( ! 215: PRExplodedTime *exploded, PRTimeParamFn params); ! 216: ! 217: /**********************************************************************/ ! 218: /*********************** TIME PARAMETER FUNCTIONS *********************/ ! 219: /**********************************************************************/ ! 220: ! 221: /* Time parameters that suit current host machine */ ! 222: NSPR_API(PRTimeParameters) PR_LocalTimeParameters(const PRExplodedTime *gmt); ! 223: ! 224: /* Time parameters that represent Greenwich Mean Time */ ! 225: NSPR_API(PRTimeParameters) PR_GMTParameters(const PRExplodedTime *gmt); ! 226: ! 227: /* ! 228: * Time parameters that represent the US Pacific Time Zone, with the ! 229: * current daylight saving time rules (for testing only) ! 230: */ ! 231: NSPR_API(PRTimeParameters) PR_USPacificTimeParameters(const PRExplodedTime *gmt); ! 232: ! 233: /* ! 234: * This parses a time/date string into a PRTime ! 235: * (microseconds after "1-Jan-1970 00:00:00 GMT"). ! 236: * It returns PR_SUCCESS on success, and PR_FAILURE ! 237: * if the time/date string can't be parsed. ! 238: * ! 239: * Many formats are handled, including: ! 240: * ! 241: * 14 Apr 89 03:20:12 ! 242: * 14 Apr 89 03:20 GMT ! 243: * Fri, 17 Mar 89 4:01:33 ! 244: * Fri, 17 Mar 89 4:01 GMT ! 245: * Mon Jan 16 16:12 PDT 1989 ! 246: * Mon Jan 16 16:12 +0130 1989 ! 247: * 6 May 1992 16:41-JST (Wednesday) ! 248: * 22-AUG-1993 10:59:12.82 ! 249: * 22-AUG-1993 10:59pm ! 250: * 22-AUG-1993 12:59am ! 251: * 22-AUG-1993 12:59 PM ! 252: * Friday, August 04, 1995 3:54 PM ! 253: * 06/21/95 04:24:34 PM ! 254: * 20/06/95 21:07 ! 255: * 95-06-08 19:32:48 EDT ! 256: * ! 257: * If the input string doesn't contain a description of the timezone, ! 258: * we consult the `default_to_gmt' to decide whether the string should ! 259: * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE). ! 260: * The correct value for this argument depends on what standard specified ! 261: * the time string which you are parsing. ! 262: */ ! 263: ! 264: NSPR_API(PRStatus) PR_ParseTimeString ( ! 265: const char *string, ! 266: PRBool default_to_gmt, ! 267: PRTime *result); ! 268: ! 269: /* ! 270: * FIXME: should we also have a formatting function, such as asctime, ctime, ! 271: * and strftime in standard C library? But this would involve ! 272: * internationalization issues. Might want to provide a US English version. ! 273: */ ! 274: ! 275: /**********************************************************************/ ! 276: /*********************** OLD COMPATIBILITYFUNCTIONS *******************/ ! 277: /**********************************************************************/ ! 278: #ifndef NO_NSPR_10_SUPPORT ! 279: ! 280: /* Format a time value into a buffer. Same semantics as strftime() */ ! 281: NSPR_API(PRUint32) PR_FormatTime(char *buf, int buflen, const char *fmt, ! 282: const PRExplodedTime *tm); ! 283: ! 284: /* Format a time value into a buffer. Time is always in US English format, regardless ! 285: * of locale setting. ! 286: */ ! 287: NSPR_API(PRUint32) ! 288: PR_FormatTimeUSEnglish( char* buf, PRUint32 bufSize, ! 289: const char* format, const PRExplodedTime* tm ); ! 290: ! 291: #endif /* NO_NSPR_10_SUPPORT */ ! 292: ! 293: PR_END_EXTERN_C ! 294: ! 295: #endif /* prtime_h___ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.