1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/* Portions are Copyright (C) 2011 Google Inc */
2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/* ***** BEGIN LICENSE BLOCK *****
3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * The contents of this file are subject to the Mozilla Public License Version
6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * 1.1 (the "License"); you may not use this file except in compliance with
7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * the License. You may obtain a copy of the License at
8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * http://www.mozilla.org/MPL/
9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Software distributed under the License is distributed on an "AS IS" basis,
11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * for the specific language governing rights and limitations under the
13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * License.
14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * The Original Code is the Netscape Portable Runtime (NSPR).
16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * The Initial Developer of the Original Code is
18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Netscape Communications Corporation.
19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Portions created by the Initial Developer are Copyright (C) 1998-2000
20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * the Initial Developer. All Rights Reserved.
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Contributor(s):
23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Alternatively, the contents of this file may be used under the terms of
25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * either the GNU General Public License Version 2 or later (the "GPL"), or
26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * in which case the provisions of the GPL or the LGPL are applicable instead
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * of those above. If you wish to allow use of your version of this file only
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * under the terms of either the GPL or the LGPL, and not to allow others to
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * use your version of this file under the terms of the MPL, indicate your
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * decision by deleting the provisions above and replace them with the notice
32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * and other provisions required by the GPL or the LGPL. If you do not delete
33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * the provisions above, a recipient may use your version of this file under
34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * the terms of any one of the MPL, the GPL or the LGPL.
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * ***** END LICENSE BLOCK ***** */
37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/*
39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *---------------------------------------------------------------------------
40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * prtime.h --
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     NSPR date and time functions
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * CVS revision 3.10
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * This file contains definitions of NSPR's basic types required by
46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * prtime.cc. These types have been copied over from the following NSPR
47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * files prtime.h, prtypes.h(CVS revision 3.35), prlong.h(CVS revision 3.13)
48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *---------------------------------------------------------------------------
50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat */
51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_PRTIME_H__
53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_PRTIME_H__
54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <stdint.h>
56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/base_export.h"
58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef int8_t PRInt8;
60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef int16_t PRInt16;
61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef int32_t PRInt32;
62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef int64_t PRInt64;
63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef int PRIntn;
64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef PRIntn PRBool;
66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_TRUE 1
67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_FALSE 0
68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef enum { PR_FAILURE = -1, PR_SUCCESS = 0 } PRStatus;
70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_ASSERT DCHECK
72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_CALLBACK
73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_INT16_MAX 32767
74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define NSPR_API(__type) extern __type
75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
7645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko/*
7745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko * Long-long (64-bit signed integer type) support macros used by
7845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko * PR_ImplodeTime().
7945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko * See http://lxr.mozilla.org/nspr/source/pr/include/prlong.h
8045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko */
8145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko
8245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko#define LL_I2L(l, i) ((l) = (PRInt64)(i))
8345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko#define LL_MUL(r, a, b) ((r) = (a) * (b))
8445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko#define LL_ADD(r, a, b) ((r) = (a) + (b))
8545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko#define LL_SUB(r, a, b) ((r) = (a) - (b))
8645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko
87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/**********************************************************************/
88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/************************* TYPES AND CONSTANTS ************************/
89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/**********************************************************************/
90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_MSEC_PER_SEC		1000UL
92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_USEC_PER_SEC		1000000UL
93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_NSEC_PER_SEC		1000000000UL
94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_USEC_PER_MSEC	1000UL
95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define PR_NSEC_PER_MSEC	1000000UL
96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/*
98b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * PRTime --
99b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     NSPR represents basic time as 64-bit signed integers relative
101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     to midnight (00:00:00), January 1, 1970 Greenwich Mean Time (GMT).
102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     (GMT is also known as Coordinated Universal Time, UTC.)
103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     The units of time are in microseconds. Negative times are allowed
104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     to represent times prior to the January 1970 epoch. Such values are
105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     intended to be exported to other systems or converted to human
106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     readable form.
107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     Notes on porting: PRTime corresponds to time_t in ANSI C.  NSPR 1.0
109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     simply uses PRInt64.
110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat */
111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef PRInt64 PRTime;
113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/*
115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Time zone and daylight saving time corrections applied to GMT to
116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * obtain the local time of some geographic location
117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat */
118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef struct PRTimeParameters {
120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt32 tp_gmt_offset;     /* the offset from GMT in seconds */
121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt32 tp_dst_offset;     /* contribution of DST in seconds */
122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} PRTimeParameters;
123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/*
125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * PRExplodedTime --
126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     Time broken down into human-readable components such as year, month,
128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     day, hour, minute, second, and microsecond.  Time zone and daylight
129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     saving time corrections may be applied.  If they are applied, the
130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     offsets from the GMT must be saved in the 'tm_params' field so that
131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     all the information is available to reconstruct GMT.
132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     Notes on porting: PRExplodedTime corrresponds to struct tm in
134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     ANSI C, with the following differences:
135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *       - an additional field tm_usec;
136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *       - replacing tm_isdst by tm_params;
137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *       - the month field is spelled tm_month, not tm_mon;
138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *       - we use absolute year, AD, not the year since 1900.
139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     The corresponding type in NSPR 1.0 is called PRTime.  Below is
140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     a table of date/time type correspondence in the three APIs:
141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *         API          time since epoch          time in components
142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *       ANSI C             time_t                  struct tm
143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *       NSPR 1.0           PRInt64                   PRTime
144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *       NSPR 2.0           PRTime                  PRExplodedTime
145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat */
146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef struct PRExplodedTime {
148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt32 tm_usec;		    /* microseconds past tm_sec (0-99999)  */
149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt32 tm_sec;             /* seconds past tm_min (0-61, accomodating
150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                   up to two leap seconds) */
151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt32 tm_min;             /* minutes past tm_hour (0-59) */
152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt32 tm_hour;            /* hours past tm_day (0-23) */
153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt32 tm_mday;            /* days past tm_mon (1-31, note that it
154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat				                starts from 1) */
155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt32 tm_month;           /* months past tm_year (0-11, Jan = 0) */
156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt16 tm_year;            /* absolute year, AD (note that we do not
157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat				                count from 1900) */
158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt8 tm_wday;		        /* calculated day of the week
160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat				                (0-6, Sun = 0) */
161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRInt16 tm_yday;            /* calculated day of the year
162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat				                (0-365, Jan 1 = 0) */
163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRTimeParameters tm_params;  /* time parameters used by conversion */
165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} PRExplodedTime;
166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/*
168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * PRTimeParamFn --
169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     A function of PRTimeParamFn type returns the time zone and
171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     daylight saving time corrections for some geographic location,
172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     given the current time in GMT.  The input argument gmt should
173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     point to a PRExplodedTime that is in GMT, i.e., whose
174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     tm_params contains all 0's.
175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     For any time zone other than GMT, the computation is intended to
177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     consist of two steps:
178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *       - Figure out the time zone correction, tp_gmt_offset.  This number
179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *         usually depends on the geographic location only.  But it may
180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *         also depend on the current time.  For example, all of China
181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *         is one time zone right now.  But this situation may change
182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *         in the future.
183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *       - Figure out the daylight saving time correction, tp_dst_offset.
184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *         This number depends on both the geographic location and the
185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *         current time.  Most of the DST rules are expressed in local
186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *         current time.  If so, one should apply the time zone correction
187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *         to GMT before applying the DST rules.
188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat */
189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef PRTimeParameters (PR_CALLBACK *PRTimeParamFn)(const PRExplodedTime *gmt);
191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/**********************************************************************/
193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/****************************** FUNCTIONS *****************************/
194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/**********************************************************************/
195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratNSPR_API(PRTime)
197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratPR_ImplodeTime(const PRExplodedTime *exploded);
198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/*
200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Adjust exploded time to normalize field overflows after manipulation.
201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Note that the following fields of PRExplodedTime should not be
202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * manipulated:
203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   - tm_month and tm_year: because the number of days in a month and
204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     number of days in a year are not constant, it is ambiguous to
205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     manipulate the month and year fields, although one may be tempted
206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     to.  For example, what does "a month from January 31st" mean?
207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   - tm_wday and tm_yday: these fields are calculated by NSPR.  Users
208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *     should treat them as "read-only".
209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat */
210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratNSPR_API(void) PR_NormalizeTime(
212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PRExplodedTime *exploded, PRTimeParamFn params);
213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/**********************************************************************/
215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/*********************** TIME PARAMETER FUNCTIONS *********************/
216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/**********************************************************************/
217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/* Time parameters that represent Greenwich Mean Time */
219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratNSPR_API(PRTimeParameters) PR_GMTParameters(const PRExplodedTime *gmt);
220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/*
222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * This parses a time/date string into a PRTime
223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * (microseconds after "1-Jan-1970 00:00:00 GMT").
224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * It returns PR_SUCCESS on success, and PR_FAILURE
225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * if the time/date string can't be parsed.
226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * Many formats are handled, including:
228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   14 Apr 89 03:20:12
230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   14 Apr 89 03:20 GMT
231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   Fri, 17 Mar 89 4:01:33
232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   Fri, 17 Mar 89 4:01 GMT
233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   Mon Jan 16 16:12 PDT 1989
234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   Mon Jan 16 16:12 +0130 1989
235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   6 May 1992 16:41-JST (Wednesday)
236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   22-AUG-1993 10:59:12.82
237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   22-AUG-1993 10:59pm
238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   22-AUG-1993 12:59am
239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   22-AUG-1993 12:59 PM
240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   Friday, August 04, 1995 3:54 PM
241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   06/21/95 04:24:34 PM
242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   20/06/95 21:07
243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   95-06-08 19:32:48 EDT
244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *   1995-06-17T23:11:25.342156Z
245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *
246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * If the input string doesn't contain a description of the timezone,
247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * we consult the `default_to_gmt' to decide whether the string should
248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE).
249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * The correct value for this argument depends on what standard specified
250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * the time string which you are parsing.
251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat */
252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat/*
254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * This is the only funtion that should be called from outside base, and only
255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat * from the unit test.
256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat */
257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT PRStatus PR_ParseTimeString (
259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat	const char *string,
260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat	PRBool default_to_gmt,
261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat	PRTime *result);
262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // BASE_PRTIME_H__
264