📄 prtime.c
字号:
* 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 + -