PRMJ_ToExtendedTime(PRInt32 time) { PRInt64 exttime; PRInt64 g1970GMTMicroSeconds; PRInt64 low; time_t diff; PRInt64 tmp; PRInt64 tmp1; diff = PRMJ_LocalGMTDifference(); LL_UI2L(tmp, PRMJ_USEC_PER_SEC); LL_I2L(tmp1,diff); LL_MUL(tmp,tmp,tmp1); LL_UI2L(g1970GMTMicroSeconds,G1970GMTMICROHI); LL_UI2L(low,G1970GMTMICROLOW); #ifndef HAVE_LONG_LONG LL_SHL(g1970GMTMicroSeconds,g1970GMTMicroSeconds,16); LL_SHL(g1970GMTMicroSeconds,g1970GMTMicroSeconds,16); #else LL_SHL(g1970GMTMicroSeconds,g1970GMTMicroSeconds,32); #endif LL_ADD(g1970GMTMicroSeconds,g1970GMTMicroSeconds,low); LL_I2L(exttime,time); LL_ADD(exttime,exttime,g1970GMTMicroSeconds); LL_SUB(exttime,exttime,tmp); return exttime; }
/* Convert from base time to extended time */ static JSInt64 PRMJ_ToExtendedTime(JSInt32 base_time) { JSInt64 exttime; JSInt64 g1970GMTMicroSeconds; JSInt64 low; JSInt32 diff; JSInt64 tmp; JSInt64 tmp1; diff = PRMJ_LocalGMTDifference(); JSLL_UI2L(tmp, PRMJ_USEC_PER_SEC); JSLL_I2L(tmp1,diff); JSLL_MUL(tmp,tmp,tmp1); JSLL_UI2L(g1970GMTMicroSeconds,G1970GMTMICROHI); JSLL_UI2L(low,G1970GMTMICROLOW); #ifndef JS_HAVE_LONG_LONG JSLL_SHL(g1970GMTMicroSeconds,g1970GMTMicroSeconds,16); JSLL_SHL(g1970GMTMicroSeconds,g1970GMTMicroSeconds,16); #else JSLL_SHL(g1970GMTMicroSeconds,g1970GMTMicroSeconds,32); #endif JSLL_ADD(g1970GMTMicroSeconds,g1970GMTMicroSeconds,low); JSLL_I2L(exttime,base_time); JSLL_ADD(exttime,exttime,g1970GMTMicroSeconds); JSLL_SUB(exttime,exttime,tmp); return exttime; }
int64_t DSTOffsetCache::computeDSTOffsetMilliseconds(int64_t localTimeSeconds) { JS_ASSERT(localTimeSeconds >= 0); JS_ASSERT(localTimeSeconds <= MAX_UNIX_TIMET); #if defined(XP_WIN) /* Windows does not follow POSIX. Updates to the * TZ environment variable are not reflected * immediately on that platform as they are * on UNIX systems without this call. */ _tzset(); #endif struct tm tm; if (!ComputeLocalTime(static_cast<time_t>(localTimeSeconds), &tm)) return 0; int32_t base = PRMJ_LocalGMTDifference(); int32_t dayoff = int32_t((localTimeSeconds - base) % (SECONDS_PER_HOUR * 24)); int32_t tmoff = tm.tm_sec + (tm.tm_min * SECONDS_PER_MINUTE) + (tm.tm_hour * SECONDS_PER_HOUR); int32_t diff = tmoff - dayoff; if (diff < 0) diff += SECONDS_PER_DAY; return diff * MILLISECONDS_PER_SECOND; }
/* Get the DST timezone offset for the time passed in */ JSInt64 PRMJ_DSTOffset(JSInt64 local_time) { JSInt64 us2s; #ifdef XP_MAC /* * Convert the local time passed in to Macintosh epoch seconds. Use UTC utilities to convert * to UTC time, then compare difference with our GMT offset. If they are the same, then * DST must not be in effect for the input date/time. */ UInt32 macLocalSeconds = (local_time / PRMJ_USEC_PER_SEC) + gJanuaryFirst1970Seconds, utcSeconds; ConvertLocalTimeToUTC(macLocalSeconds, &utcSeconds); if ((utcSeconds - macLocalSeconds) == PRMJ_LocalGMTDifference()) return 0; else { JSInt64 dlsOffset; JSLL_UI2L(us2s, PRMJ_USEC_PER_SEC); JSLL_UI2L(dlsOffset, PRMJ_HOUR_SECONDS); JSLL_MUL(dlsOffset, dlsOffset, us2s); return dlsOffset; } #else time_t local; JSInt32 diff; JSInt64 maxtimet; struct tm tm; PRMJTime prtm; #ifndef HAVE_LOCALTIME_R struct tm *ptm; #endif JSLL_UI2L(us2s, PRMJ_USEC_PER_SEC); JSLL_DIV(local_time, local_time, us2s); /* get the maximum of time_t value */ JSLL_UI2L(maxtimet,PRMJ_MAX_UNIX_TIMET); if(JSLL_CMP(local_time,>,maxtimet)){ JSLL_UI2L(local_time,PRMJ_MAX_UNIX_TIMET); } else if(!JSLL_GE_ZERO(local_time)){
PRMJ_Now(void) { #ifdef XP_PC PRInt64 s, us, ms2us, s2us; struct timeb b; #endif /* XP_PC */ #ifdef XP_UNIX struct timeval tv; PRInt64 s, us, s2us; #endif /* XP_UNIX */ #ifdef XP_MAC UnsignedWide upTime; PRInt64 localTime; PRInt64 gmtOffset; PRInt64 dstOffset; time_t gmtDiff; PRInt64 s2us; #endif /* XP_MAC */ #ifdef XP_PC ftime(&b); LL_UI2L(ms2us, PRMJ_USEC_PER_MSEC); LL_UI2L(s2us, PRMJ_USEC_PER_SEC); LL_UI2L(s, b.time); LL_UI2L(us, b.millitm); LL_MUL(us, us, ms2us); LL_MUL(s, s, s2us); LL_ADD(s, s, us); return s; #endif #ifdef XP_UNIX #if defined(SOLARIS) gettimeofday(&tv); #else gettimeofday(&tv, 0); #endif /* SOLARIS */ LL_UI2L(s2us, PRMJ_USEC_PER_SEC); LL_UI2L(s, tv.tv_sec); LL_UI2L(us, tv.tv_usec); LL_MUL(s, s, s2us); LL_ADD(s, s, us); return s; #endif /* XP_UNIX */ #ifdef XP_MAC LL_UI2L(localTime,0); gmtDiff = PRMJ_LocalGMTDifference(); LL_I2L(gmtOffset,gmtDiff); LL_UI2L(s2us, PRMJ_USEC_PER_SEC); LL_MUL(gmtOffset,gmtOffset,s2us); LL_UI2L(dstOffset,0); dstOffset = PRMJ_DSTOffset(dstOffset); LL_SUB(gmtOffset,gmtOffset,dstOffset); /* don't adjust for DST since it sets ctime and gmtime off on the MAC */ Microseconds(&upTime); LL_ADD(localTime,localTime,gmtOffset); LL_ADD(localTime,localTime, *((PRUint64 *)&dstLocalBaseMicroseconds)); LL_ADD(localTime,localTime, *((PRUint64 *)&upTime)); return *((PRUint64 *)&localTime); #endif /* XP_MAC */ }
JSInt64 PRMJ_Now(void) { #ifdef XP_OS2 JSInt64 s, us, ms2us, s2us; struct timeb b; #endif #ifdef XP_WIN JSInt64 s, us, win2un = JSLL_INIT(0x19DB1DE, 0xD53E8000), ten = JSLL_INIT(0, 10); FILETIME time, midnight; #endif #if defined(XP_UNIX) || defined(XP_BEOS) struct timeval tv; JSInt64 s, us, s2us; #endif /* XP_UNIX */ #ifdef XP_MAC JSUint64 upTime; JSInt64 localTime; JSInt64 gmtOffset; JSInt64 dstOffset; JSInt32 gmtDiff; JSInt64 s2us; #endif /* XP_MAC */ #ifdef XP_OS2 ftime(&b); JSLL_UI2L(ms2us, PRMJ_USEC_PER_MSEC); JSLL_UI2L(s2us, PRMJ_USEC_PER_SEC); JSLL_UI2L(s, b.time); JSLL_UI2L(us, b.millitm); JSLL_MUL(us, us, ms2us); JSLL_MUL(s, s, s2us); JSLL_ADD(s, s, us); return s; #endif #ifdef XP_WIN /* The windows epoch is around 1600. The unix epoch is around 1970. win2un is the difference (in windows time units which are 10 times more precise than the JS time unit) */ GetSystemTimeAsFileTime(&time); /* Win9x gets confused at midnight http://support.microsoft.com/default.aspx?scid=KB;en-us;q224423 So if the low part (precision <8mins) is 0 then we get the time again. */ if (!time.dwLowDateTime) { GetSystemTimeAsFileTime(&midnight); time.dwHighDateTime = midnight.dwHighDateTime; } JSLL_UI2L(s, time.dwHighDateTime); JSLL_UI2L(us, time.dwLowDateTime); JSLL_SHL(s, s, 32); JSLL_ADD(s, s, us); JSLL_SUB(s, s, win2un); JSLL_DIV(s, s, ten); return s; #endif #if defined(XP_UNIX) || defined(XP_BEOS) #ifdef _SVID_GETTOD /* Defined only on Solaris, see Solaris <sys/types.h> */ gettimeofday(&tv); #else gettimeofday(&tv, 0); #endif /* _SVID_GETTOD */ JSLL_UI2L(s2us, PRMJ_USEC_PER_SEC); JSLL_UI2L(s, tv.tv_sec); JSLL_UI2L(us, tv.tv_usec); JSLL_MUL(s, s, s2us); JSLL_ADD(s, s, us); return s; #endif /* XP_UNIX */ #ifdef XP_MAC JSLL_UI2L(localTime,0); gmtDiff = PRMJ_LocalGMTDifference(); JSLL_I2L(gmtOffset,gmtDiff); JSLL_UI2L(s2us, PRMJ_USEC_PER_SEC); JSLL_MUL(gmtOffset,gmtOffset,s2us); /* don't adjust for DST since it sets ctime and gmtime off on the MAC */ Microseconds((UnsignedWide*)&upTime); JSLL_ADD(localTime,localTime,gmtOffset); JSLL_ADD(localTime,localTime, dstLocalBaseMicroseconds); JSLL_ADD(localTime,localTime, upTime); dstOffset = PRMJ_DSTOffset(localTime); JSLL_SUB(localTime,localTime,dstOffset); return *((JSUint64 *)&localTime); #endif /* XP_MAC */ }