⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prtime.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 5 页
字号:
             * assuming the time zone has not changed since then.             */            retVal.tp_gmt_offset = offset2Jan1970;            retVal.tp_dst_offset = offsetNew - offset2Jan1970;        } else {            /*             * DST was also in effect back in 2 Jan. 1970.             * Then our clever trick (or rather, ugly hack) fails.             * We will just assume DST offset is an hour.             */            retVal.tp_gmt_offset = offsetNew - 3600;            retVal.tp_dst_offset = 3600;        }    }        return retVal;}#endif    /* defined(XP_UNIX) !! defined(XP_PC) *//* *------------------------------------------------------------------------ * * PR_USPacificTimeParameters -- * *     The time parameters function for the US Pacific Time Zone. * *------------------------------------------------------------------------ */PR_IMPLEMENT(PRTimeParameters)PR_USPacificTimeParameters(const PRExplodedTime *gmt){    PRTimeParameters retVal;    PRExplodedTime st;    /*     * Based on geographic location and GMT, figure out offset of     * standard time from GMT.  In this example implementation, we     * assume the local time zone is US Pacific Time.     */    retVal.tp_gmt_offset = -8L * 3600L;    /*     * Make a copy of GMT.  Note that the tm_params field of this copy     * is ignored.     */    st.tm_usec = gmt->tm_usec;    st.tm_sec = gmt->tm_sec;    st.tm_min = gmt->tm_min;    st.tm_hour = gmt->tm_hour;    st.tm_mday = gmt->tm_mday;    st.tm_month = gmt->tm_month;    st.tm_year = gmt->tm_year;    st.tm_wday = gmt->tm_wday;    st.tm_yday = gmt->tm_yday;    /* Apply the offset to GMT to obtain the local standard time */    ApplySecOffset(&st, retVal.tp_gmt_offset);    /*     * Apply the rules on standard time or GMT to obtain daylight saving     * time offset.  In this implementation, we use the US DST rule.     */    if (st.tm_month < 3) {        retVal.tp_dst_offset = 0L;    } else if (st.tm_month == 3) {        if (st.tm_wday == 0) {            /* A Sunday */            if (st.tm_mday <= 7) {                /* First Sunday */                /* 01:59:59 PST -> 03:00:00 PDT */                if (st.tm_hour < 2) {                    retVal.tp_dst_offset = 0L;                } else {                    retVal.tp_dst_offset = 3600L;                }            } else {                /* Not first Sunday */                retVal.tp_dst_offset = 3600L;            }        } else {            /* Not a Sunday.  See if before first Sunday or after */            if (st.tm_wday + 1 <= st.tm_mday) {                /* After first Sunday */                retVal.tp_dst_offset = 3600L;            } else {                /* Before first Sunday */                retVal.tp_dst_offset = 0L;            }         }    } else if (st.tm_month < 9) {        retVal.tp_dst_offset = 3600L;    } else if (st.tm_month == 9) {        if (st.tm_wday == 0) {            if (31 - st.tm_mday < 7) {                /* Last Sunday */                /* 01:59:59 PDT -> 01:00:00 PST */                if (st.tm_hour < 1) {                    retVal.tp_dst_offset = 3600L;                } else {                    retVal.tp_dst_offset = 0L;                }            } else {                /* Not last Sunday */                retVal.tp_dst_offset = 3600L;            }        } else {            /* See if before or after last Sunday */            if (7 - st.tm_wday <= 31 - st.tm_mday) {                /* before last Sunday */                retVal.tp_dst_offset = 3600L;            } else {                retVal.tp_dst_offset = 0L;            }        }    } else {        retVal.tp_dst_offset = 0L;    }    return retVal;}/* *------------------------------------------------------------------------ * * PR_GMTParameters -- * *     Returns the PRTimeParameters for Greenwich Mean Time. *     Trivially, both the tp_gmt_offset and tp_dst_offset fields are 0. * *------------------------------------------------------------------------ */PR_IMPLEMENT(PRTimeParameters)PR_GMTParameters(const PRExplodedTime *gmt){#if defined(XP_MAC)#pragma unused (gmt)#endif    PRTimeParameters retVal = { 0, 0 };    return retVal;}/* * The following code implements PR_ParseTimeString().  It is based on * ns/lib/xp/xp_time.c, revision 1.25, by Jamie Zawinski <jwz@netscape.com>. *//* * We only recognize the abbreviations of a small subset of time zones * in North America, Europe, and Japan. * * PST/PDT: Pacific Standard/Daylight Time * MST/MDT: Mountain Standard/Daylight Time * CST/CDT: Central Standard/Daylight Time * EST/EDT: Eastern Standard/Daylight Time * AST: Atlantic Standard Time * NST: Newfoundland Standard Time * GMT: Greenwich Mean Time * BST: British Summer Time * MET: Middle Europe Time * EET: Eastern Europe Time * JST: Japan Standard Time */typedef enum{  TT_UNKNOWN,  TT_SUN, TT_MON, TT_TUE, TT_WED, TT_THU, TT_FRI, TT_SAT,  TT_JAN, TT_FEB, TT_MAR, TT_APR, TT_MAY, TT_JUN,  TT_JUL, TT_AUG, TT_SEP, TT_OCT, TT_NOV, TT_DEC,  TT_PST, TT_PDT, TT_MST, TT_MDT, TT_CST, TT_CDT, TT_EST, TT_EDT,  TT_AST, TT_NST, TT_GMT, TT_BST, TT_MET, TT_EET, TT_JST} TIME_TOKEN;/* * This parses a time/date string into a PRTime * (microseconds after "1-Jan-1970 00:00:00 GMT"). * It returns PR_SUCCESS on success, and PR_FAILURE * if the time/date string can't be parsed. * * Many formats are handled, including: * *   14 Apr 89 03:20:12 *   14 Apr 89 03:20 GMT *   Fri, 17 Mar 89 4:01:33 *   Fri, 17 Mar 89 4:01 GMT *   Mon Jan 16 16:12 PDT 1989 *   Mon Jan 16 16:12 +0130 1989 *   6 May 1992 16:41-JST (Wednesday) *   22-AUG-1993 10:59:12.82 *   22-AUG-1993 10:59pm *   22-AUG-1993 12:59am *   22-AUG-1993 12:59 PM *   Friday, August 04, 1995 3:54 PM *   06/21/95 04:24:34 PM *   20/06/95 21:07 *   95-06-08 19:32:48 EDT * * If the input string doesn't contain a description of the timezone, * we consult the `default_to_gmt' to decide whether the string should * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE). * The correct value for this argument depends on what standard specified * the time string which you are parsing. */PR_IMPLEMENT(PRStatus)PR_ParseTimeString(        const char *string,        PRBool default_to_gmt,        PRTime *result){  PRExplodedTime tm;  TIME_TOKEN dotw = TT_UNKNOWN;  TIME_TOKEN month = TT_UNKNOWN;  TIME_TOKEN zone = TT_UNKNOWN;  int zone_offset = -1;  int date = -1;  PRInt32 year = -1;  int hour = -1;  int min = -1;  int sec = -1;  const char *rest = string;#ifdef DEBUG  int iterations = 0;#endif  PR_ASSERT(string && result);  if (!string || !result) return PR_FAILURE;  while (*rest)        {#ifdef DEBUG          if (iterations++ > 1000)                {                  PR_ASSERT(0);                  return PR_FAILURE;                }#endif          switch (*rest)                {                case 'a': case 'A':                  if (month == TT_UNKNOWN &&                          (rest[1] == 'p' || rest[1] == 'P') &&                          (rest[2] == 'r' || rest[2] == 'R'))                        month = TT_APR;                  else if (zone == TT_UNKNOWN &&                                   (rest[1] == 's' || rest[1] == 's') &&                                   (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_AST;                  else if (month == TT_UNKNOWN &&                                   (rest[1] == 'u' || rest[1] == 'U') &&                                   (rest[2] == 'g' || rest[2] == 'G'))                        month = TT_AUG;                  break;                case 'b': case 'B':                  if (zone == TT_UNKNOWN &&                          (rest[1] == 's' || rest[1] == 'S') &&                          (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_BST;                  break;                case 'c': case 'C':                  if (zone == TT_UNKNOWN &&                          (rest[1] == 'd' || rest[1] == 'D') &&                          (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_CDT;                  else if (zone == TT_UNKNOWN &&                                   (rest[1] == 's' || rest[1] == 'S') &&                                   (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_CST;                  break;                case 'd': case 'D':                  if (month == TT_UNKNOWN &&                          (rest[1] == 'e' || rest[1] == 'E') &&                          (rest[2] == 'c' || rest[2] == 'C'))                        month = TT_DEC;                  break;                case 'e': case 'E':                  if (zone == TT_UNKNOWN &&                          (rest[1] == 'd' || rest[1] == 'D') &&                          (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_EDT;                  else if (zone == TT_UNKNOWN &&                                   (rest[1] == 'e' || rest[1] == 'E') &&                                   (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_EET;                  else if (zone == TT_UNKNOWN &&                                   (rest[1] == 's' || rest[1] == 'S') &&                                   (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_EST;                  break;                case 'f': case 'F':                  if (month == TT_UNKNOWN &&                          (rest[1] == 'e' || rest[1] == 'E') &&                          (rest[2] == 'b' || rest[2] == 'B'))                        month = TT_FEB;                  else if (dotw == TT_UNKNOWN &&                                   (rest[1] == 'r' || rest[1] == 'R') &&                                   (rest[2] == 'i' || rest[2] == 'I'))                        dotw = TT_FRI;                  break;                case 'g': case 'G':                  if (zone == TT_UNKNOWN &&                          (rest[1] == 'm' || rest[1] == 'M') &&                          (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_GMT;                  break;                case 'j': case 'J':                  if (month == TT_UNKNOWN &&                          (rest[1] == 'a' || rest[1] == 'A') &&                          (rest[2] == 'n' || rest[2] == 'N'))                        month = TT_JAN;                  else if (zone == TT_UNKNOWN &&                                   (rest[1] == 's' || rest[1] == 'S') &&                                   (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_JST;                  else if (month == TT_UNKNOWN &&                                   (rest[1] == 'u' || rest[1] == 'U') &&                                   (rest[2] == 'l' || rest[2] == 'L'))                        month = TT_JUL;                  else if (month == TT_UNKNOWN &&                                   (rest[1] == 'u' || rest[1] == 'U') &&                                   (rest[2] == 'n' || rest[2] == 'N'))                        month = TT_JUN;                  break;                case 'm': case 'M':                  if (month == TT_UNKNOWN &&                          (rest[1] == 'a' || rest[1] == 'A') &&                          (rest[2] == 'r' || rest[2] == 'R'))                        month = TT_MAR;                  else if (month == TT_UNKNOWN &&                                   (rest[1] == 'a' || rest[1] == 'A') &&                                   (rest[2] == 'y' || rest[2] == 'Y'))                        month = TT_MAY;                  else if (zone == TT_UNKNOWN &&                                   (rest[1] == 'd' || rest[1] == 'D') &&                                   (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_MDT;                  else if (zone == TT_UNKNOWN &&                                   (rest[1] == 'e' || rest[1] == 'E') &&                                   (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_MET;                  else if (dotw == TT_UNKNOWN &&                                   (rest[1] == 'o' || rest[1] == 'O') &&                                   (rest[2] == 'n' || rest[2] == 'N'))                        dotw = TT_MON;                  else if (zone == TT_UNKNOWN &&                                   (rest[1] == 's' || rest[1] == 'S') &&                                   (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_MST;                  break;                case 'n': case 'N':                  if (month == TT_UNKNOWN &&                          (rest[1] == 'o' || rest[1] == 'O') &&                          (rest[2] == 'v' || rest[2] == 'V'))                        month = TT_NOV;                  else if (zone == TT_UNKNOWN &&                                   (rest[1] == 's' || rest[1] == 'S') &&                                   (rest[2] == 't' || rest[2] == 'T'))                        zone = TT_NST;                  break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -