X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/c8269701e1f9e7b1dcbe771b4e7a802f050436d4..ea88c40cb048cd70b799735e08ac60eb7e0cd54c:/time64.c diff --git a/time64.c b/time64.c old mode 100755 new mode 100644 index 9be965a..9faab10 --- a/time64.c +++ b/time64.c @@ -368,22 +368,22 @@ static struct TM *S_gmtime64_r (const Time64_T *in_time, struct TM *p) p->tm_isdst = 0; #ifdef HAS_TM_TM_ZONE - p->tm_zone = "UTC"; + p->tm_zone = (char *)"UTC"; #endif - v_tm_sec = (int)(time % 60); - time /= 60; - v_tm_min = (int)(time % 60); - time /= 60; - v_tm_hour = (int)(time % 24); - time /= 24; + v_tm_sec = (int)fmod(time, 60.0); + time = time >= 0 ? floor(time / 60.0) : ceil(time / 60.0); + v_tm_min = (int)fmod(time, 60.0); + time = time >= 0 ? floor(time / 60.0) : ceil(time / 60.0); + v_tm_hour = (int)fmod(time, 24.0); + time = time >= 0 ? floor(time / 24.0) : ceil(time / 24.0); v_tm_tday = time; WRAP (v_tm_sec, v_tm_min, 60); WRAP (v_tm_min, v_tm_hour, 60); WRAP (v_tm_hour, v_tm_tday, 24); - v_tm_wday = (int)((v_tm_tday + 4) % 7); + v_tm_wday = (int)fmod((v_tm_tday + 4.0), 7.0); if (v_tm_wday < 0) v_tm_wday += 7; m = v_tm_tday; @@ -395,7 +395,7 @@ static struct TM *S_gmtime64_r (const Time64_T *in_time, struct TM *p) if (m >= 0) { /* Gregorian cycles, this is huge optimization for distant times */ - cycles = (int)(m / (Time64_T) days_in_gregorian_cycle); + cycles = (int)floor(m / (Time64_T) days_in_gregorian_cycle); if( cycles ) { m -= (cycles * (Time64_T) days_in_gregorian_cycle); year += (cycles * years_in_gregorian_cycle); @@ -419,7 +419,7 @@ static struct TM *S_gmtime64_r (const Time64_T *in_time, struct TM *p) year--; /* Gregorian cycles */ - cycles = (int)((m / (Time64_T) days_in_gregorian_cycle) + 1); + cycles = (int)ceil((m / (Time64_T) days_in_gregorian_cycle) + 1); if( cycles ) { m -= (cycles * (Time64_T) days_in_gregorian_cycle); year += (cycles * years_in_gregorian_cycle); @@ -465,7 +465,7 @@ static struct TM *S_gmtime64_r (const Time64_T *in_time, struct TM *p) } -struct TM *S_localtime64_r (const Time64_T *time, struct TM *local_tm) +static struct TM *S_localtime64_r (const Time64_T *time, struct TM *local_tm) { time_t safe_time; struct tm safe_date; @@ -543,7 +543,7 @@ struct TM *S_localtime64_r (const Time64_T *time, struct TM *local_tm) /* GMT is Jan 1st, xx01 year, but localtime is still Dec 31st in a non-leap xx00. There is one point in the cycle we can't account for which the safe xx00 year is a leap - year. So we need to correct for Dec 31st comming out as + year. So we need to correct for Dec 31st coming out as the 366th day of the year. */ if( !IS_LEAP(local_tm->tm_year) && local_tm->tm_yday == 365 )