15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The contents of this file are subject to the Mozilla Public
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License Version 1.1 (the "License"); you may not use this file
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * except in compliance with the License. You may obtain a copy of
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the License at http://www.mozilla.org/MPL/
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Software distributed under the License is distributed on an "AS
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * implied. See the License for the specific language governing
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * rights and limitations under the License.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Original Code is the Netscape Portable Runtime (NSPR).
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Initial Developer of the Original Code is Netscape
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Communications Corporation.  Portions created by Netscape are
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1998-2000 Netscape Communications Corporation.  All
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Rights Reserved.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Contributor(s):
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Alternatively, the contents of this file may be used under the
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * terms of the GNU General Public License Version 2 or later (the
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "GPL"), in which case the provisions of the GPL are applicable
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instead of those above.  If you wish to allow use of your
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * version of this file only under the terms of the GPL and not to
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * allow others to use your version of this file under the MPL,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * indicate your decision by deleting the provisions above and
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * replace them with the notice and other provisions required by
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the GPL.  If you do not delete the provisions above, a recipient
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * may use your version of this file under either the MPL or the
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * GPL.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *----------------------------------------------------------------------
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * prtime.h --
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     NSPR date and time functions
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *-----------------------------------------------------------------------
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef prtime_h___
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define prtime_h___
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "prlong.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PR_BEGIN_EXTERN_C
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************* TYPES AND CONSTANTS ************************/
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_MSEC_PER_SEC		1000UL
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_USEC_PER_SEC		1000000UL
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_NSEC_PER_SEC		1000000000UL
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_USEC_PER_MSEC	1000UL
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PR_NSEC_PER_MSEC	1000000UL
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PRTime --
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     NSPR represents basic time as 64-bit signed integers relative
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     to midnight (00:00:00), January 1, 1970 Greenwich Mean Time (GMT).
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     (GMT is also known as Coordinated Universal Time, UTC.)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     The units of time are in microseconds. Negative times are allowed
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     to represent times prior to the January 1970 epoch. Such values are
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     intended to be exported to other systems or converted to human
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     readable form.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     Notes on porting: PRTime corresponds to time_t in ANSI C.  NSPR 1.0
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     simply uses PRInt64.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef PRInt64 PRTime;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Time zone and daylight saving time corrections applied to GMT to
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * obtain the local time of some geographic location
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct PRTimeParameters {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt32 tp_gmt_offset;     /* the offset from GMT in seconds */
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt32 tp_dst_offset;     /* contribution of DST in seconds */
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} PRTimeParameters;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PRExplodedTime --
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     Time broken down into human-readable components such as year, month,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     day, hour, minute, second, and microsecond.  Time zone and daylight
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     saving time corrections may be applied.  If they are applied, the
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     offsets from the GMT must be saved in the 'tm_params' field so that
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     all the information is available to reconstruct GMT.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     Notes on porting: PRExplodedTime corrresponds to struct tm in
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     ANSI C, with the following differences:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       - an additional field tm_usec;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       - replacing tm_isdst by tm_params;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       - the month field is spelled tm_month, not tm_mon;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       - we use absolute year, AD, not the year since 1900.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     The corresponding type in NSPR 1.0 is called PRTime.  Below is
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     a table of date/time type correspondence in the three APIs:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         API          time since epoch          time in components
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       ANSI C             time_t                  struct tm
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       NSPR 1.0           PRInt64                   PRTime
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       NSPR 2.0           PRTime                  PRExplodedTime
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct PRExplodedTime {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt32 tm_usec;		    /* microseconds past tm_sec (0-99999)  */
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt32 tm_sec;             /* seconds past tm_min (0-61, accomodating
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   up to two leap seconds) */
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt32 tm_min;             /* minutes past tm_hour (0-59) */
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt32 tm_hour;            /* hours past tm_day (0-23) */
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt32 tm_mday;            /* days past tm_mon (1-31, note that it
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				                starts from 1) */
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt32 tm_month;           /* months past tm_year (0-11, Jan = 0) */
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt16 tm_year;            /* absolute year, AD (note that we do not
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				                count from 1900) */
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt8 tm_wday;		        /* calculated day of the week
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				                (0-6, Sun = 0) */
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRInt16 tm_yday;            /* calculated day of the year
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				                (0-365, Jan 1 = 0) */
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRTimeParameters tm_params;  /* time parameters used by conversion */
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} PRExplodedTime;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PRTimeParamFn --
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     A function of PRTimeParamFn type returns the time zone and
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     daylight saving time corrections for some geographic location,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     given the current time in GMT.  The input argument gmt should
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     point to a PRExplodedTime that is in GMT, i.e., whose
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     tm_params contains all 0's.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     For any time zone other than GMT, the computation is intended to
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     consist of two steps:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       - Figure out the time zone correction, tp_gmt_offset.  This number
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         usually depends on the geographic location only.  But it may
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         also depend on the current time.  For example, all of China
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         is one time zone right now.  But this situation may change
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         in the future.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       - Figure out the daylight saving time correction, tp_dst_offset.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         This number depends on both the geographic location and the
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         current time.  Most of the DST rules are expressed in local
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         current time.  If so, one should apply the time zone correction
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         to GMT before applying the DST rules.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef PRTimeParameters (PR_CALLBACK *PRTimeParamFn)(const PRExplodedTime *gmt);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/****************************** FUNCTIONS *****************************/
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The PR_Now routine returns the current time relative to the
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * epoch, midnight, January 1, 1970 UTC. The units of the returned
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * value are microseconds since the epoch.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The values returned are not guaranteed to advance in a linear fashion
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * due to the application of time correction protocols which synchronize
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * computer clocks to some external time source. Consequently it should
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * not be depended on for interval timing.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The implementation is machine dependent.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cf. time_t time(time_t *tp) in ANSI C.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE_WATCOM_BUG_2)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PRTime __pascal __export __loadds
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(PRTime)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PR_Now(void);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Expand time binding it to time parameters provided by PRTimeParamFn.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The calculation is envisoned to proceed in the following steps:
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - From given PRTime, calculate PRExplodedTime in GMT
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - Apply the given PRTimeParamFn to the GMT that we just calculated
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     to obtain PRTimeParameters.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - Add the PRTimeParameters offsets to GMT to get the local time
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     as PRExplodedTime.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(void) PR_ExplodeTime(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRTime usecs, PRTimeParamFn params, PRExplodedTime *exploded);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Reverse operation of PR_ExplodeTime */
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE_WATCOM_BUG_2)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PRTime __pascal __export __loadds
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(PRTime)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PR_ImplodeTime(const PRExplodedTime *exploded);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Adjust exploded time to normalize field overflows after manipulation.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that the following fields of PRExplodedTime should not be
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * manipulated:
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - tm_month and tm_year: because the number of days in a month and
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     number of days in a year are not constant, it is ambiguous to
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     manipulate the month and year fields, although one may be tempted
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     to.  For example, what does "a month from January 31st" mean?
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - tm_wday and tm_yday: these fields are calculated by NSPR.  Users
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     should treat them as "read-only".
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(void) PR_NormalizeTime(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRExplodedTime *exploded, PRTimeParamFn params);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*********************** TIME PARAMETER FUNCTIONS *********************/
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Time parameters that suit current host machine */
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(PRTimeParameters) PR_LocalTimeParameters(const PRExplodedTime *gmt);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Time parameters that represent Greenwich Mean Time */
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(PRTimeParameters) PR_GMTParameters(const PRExplodedTime *gmt);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Time parameters that represent the US Pacific Time Zone, with the
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * current daylight saving time rules (for testing only)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(PRTimeParameters) PR_USPacificTimeParameters(const PRExplodedTime *gmt);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This parses a time/date string into a PRTime
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (microseconds after "1-Jan-1970 00:00:00 GMT").
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It returns PR_SUCCESS on success, and PR_FAILURE
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if the time/date string can't be parsed.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Many formats are handled, including:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   14 Apr 89 03:20:12
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   14 Apr 89 03:20 GMT
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Fri, 17 Mar 89 4:01:33
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Fri, 17 Mar 89 4:01 GMT
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Mon Jan 16 16:12 PDT 1989
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Mon Jan 16 16:12 +0130 1989
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   6 May 1992 16:41-JST (Wednesday)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   22-AUG-1993 10:59:12.82
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   22-AUG-1993 10:59pm
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   22-AUG-1993 12:59am
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   22-AUG-1993 12:59 PM
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Friday, August 04, 1995 3:54 PM
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   06/21/95 04:24:34 PM
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   20/06/95 21:07
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   95-06-08 19:32:48 EDT
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the input string doesn't contain a description of the timezone,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we consult the `default_to_gmt' to decide whether the string should
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE).
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The correct value for this argument depends on what standard specified
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the time string which you are parsing.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(PRStatus) PR_ParseTimeString (
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const char *string,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PRBool default_to_gmt,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PRTime *result);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FIXME: should we also have a formatting function, such as asctime, ctime,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and strftime in standard C library?  But this would involve
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * internationalization issues.  Might want to provide a US English version.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*********************** OLD COMPATIBILITYFUNCTIONS *******************/
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NO_NSPR_10_SUPPORT
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Format a time value into a buffer. Same semantics as strftime() */
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(PRUint32) PR_FormatTime(char *buf, int buflen, const char *fmt,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const PRExplodedTime *tm);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Format a time value into a buffer. Time is always in US English format, regardless
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of locale setting.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSPR_API(PRUint32)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PR_FormatTimeUSEnglish( char* buf, PRUint32 bufSize,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const char* format, const PRExplodedTime* tm );
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NO_NSPR_10_SUPPORT */
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PR_END_EXTERN_C
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* prtime_h___ */
296