PRMJ_setDST(PRMJTime *prtm) { #ifdef XP_MAC MachineLocation machineLocation; if(prtm->tm_isdst < 0){ MyReadLocation(&machineLocation); /* Figure out daylight savings time. */ prtm->tm_isdst = (machineLocation.u.dlsDelta != 0); } #else struct tm time; if(prtm->tm_isdst < 0){ if(prtm->tm_year >= 1970 && prtm->tm_year <= 2037){ time.tm_sec = prtm->tm_sec ; time.tm_min = prtm->tm_min ; time.tm_hour = prtm->tm_hour; time.tm_mday = prtm->tm_mday; time.tm_mon = prtm->tm_mon ; time.tm_wday = prtm->tm_wday; time.tm_year = prtm->tm_year-1900; time.tm_yday = prtm->tm_yday; time.tm_isdst = -1; mktime(&time); prtm->tm_isdst = time.tm_isdst; } else { prtm->tm_isdst = 0; } } #endif /* XP_MAC */ }
/* * get the difference in seconds between this time zone and UTC (GMT) */ JSInt32 PRMJ_LocalGMTDifference() { #if defined(XP_UNIX) || defined(XP_WIN) || defined(XP_OS2) || defined(XP_BEOS) struct tm ltime; /* get the difference between this time zone and GMT */ memset((char *)<ime,0,sizeof(ltime)); ltime.tm_mday = 2; ltime.tm_year = 70; #ifdef SUNOS4 ltime.tm_zone = 0; ltime.tm_gmtoff = 0; return timelocal(<ime) - (24 * 3600); #else return mktime(<ime) - (24L * 3600L); #endif #endif #if defined(XP_MAC) static JSInt32 zone = -1L; MachineLocation machineLocation; JSInt32 gmtOffsetSeconds; /* difference has been set no need to recalculate */ if (zone != -1) return zone; /* Get the information about the local machine, including * its GMT offset and its daylight savings time info. * Convert each into wides that we can add to * startupTimeMicroSeconds. */ MyReadLocation(&machineLocation); /* Mask off top eight bits of gmtDelta, sign extend lower three. */ gmtOffsetSeconds = (machineLocation.u.gmtDelta << 8); gmtOffsetSeconds >>= 8; /* Backout OS adjustment for DST, to give consistent GMT offset. */ if (machineLocation.u.dlsDelta != 0) gmtOffsetSeconds -= PRMJ_HOUR_SECONDS; return (zone = -gmtOffsetSeconds); #endif }
PRMJ_DSTOffset(PRInt64 time) { PRInt64 us2s; #ifdef XP_MAC MachineLocation machineLocation; PRInt64 dlsOffset; /* Get the information about the local machine, including * its GMT offset and its daylight savings time info. * Convert each into wides that we can add to * startupTimeMicroSeconds. */ MyReadLocation(&machineLocation); /* Is Daylight Savings On? If so, we need to add an hour to the offset. */ if (machineLocation.u.dlsDelta != 0) { LL_UI2L(us2s, PRMJ_USEC_PER_SEC); /* seconds in a microseconds */ LL_UI2L(dlsOffset, PRMJ_HOUR_SECONDS); /* seconds in one hour */ LL_MUL(dlsOffset, dlsOffset, us2s); } else LL_I2L(dlsOffset, 0); return(dlsOffset); #else time_t local; PRInt32 diff; PRInt64 maxtimet; struct tm tm; #if defined( XP_PC ) || defined( FREEBSD ) struct tm *ptm; #endif PRMJTime prtm; LL_UI2L(us2s, PRMJ_USEC_PER_SEC); LL_DIV(time, time, us2s); /* get the maximum of time_t value */ LL_UI2L(maxtimet,PRMJ_MAX_UNIX_TIMET); if(LL_CMP(time,>,maxtimet)){ LL_UI2L(time,PRMJ_MAX_UNIX_TIMET); } else if(!LL_GE_ZERO(time)){
/* * get the difference in seconds between this time zone and UTC (GMT) */ PR_IMPLEMENT(time_t) PRMJ_LocalGMTDifference() { #if defined(XP_UNIX) || defined(XP_PC) struct tm ltime; /* get the difference between this time zone and GMT */ memset((char *)<ime,0,sizeof(ltime)); ltime.tm_mday = 2; ltime.tm_year = 70; #ifdef SUNOS4 ltime.tm_zone = 0; ltime.tm_gmtoff = 0; return timelocal(<ime) - (24 * 3600); #else return mktime(<ime) - (24L * 3600L); #endif #endif #if defined(XP_MAC) static time_t zone = -1L; MachineLocation machineLocation; PRUint64 gmtOffsetSeconds; PRUint64 gmtDelta; PRUint64 dlsOffset; PRInt32 offset; /* difference has been set no need to recalculate */ if(zone != -1) return zone; /* Get the information about the local machine, including * its GMT offset and its daylight savings time info. * Convert each into wides that we can add to * startupTimeMicroSeconds. */ MyReadLocation(&machineLocation); /* Mask off top eight bits of gmtDelta, sign extend lower three. */ if ((machineLocation.u.gmtDelta & 0x00800000) != 0) { gmtOffsetSeconds.lo = (machineLocation.u.gmtDelta & 0x00FFFFFF) | 0xFF000000; gmtOffsetSeconds.hi = 0xFFFFFFFF; LL_UI2L(gmtDelta,0); } else { gmtOffsetSeconds.lo = (machineLocation.u.gmtDelta & 0x00FFFFFF); gmtOffsetSeconds.hi = 0; LL_UI2L(gmtDelta,PRMJ_DAY_SECONDS); } /* normalize time to be positive if you are behind GMT. gmtDelta will always * be positive. */ LL_SUB(gmtDelta,gmtDelta,gmtOffsetSeconds); /* Is Daylight Savings On? If so, we need to add an hour to the offset. */ if (machineLocation.u.dlsDelta != 0) { LL_UI2L(dlsOffset, PRMJ_HOUR_SECONDS); } else LL_I2L(dlsOffset, 0); LL_ADD(gmtDelta,gmtDelta, dlsOffset); LL_L2I(offset,gmtDelta); zone = offset; return (time_t)offset; #endif }