static void get_date_string(char *buf, int buf_len) { time_t now = time(NULL); struct tm tm; char tzbuf[MAXSTRING]; long my_timezone; /* Add RFC822 date */ (void)localtime_r(&now, &tm); my_timezone = tz_offset(now, tm); strftime(buf, buf_len, "%a, %d %b %Y %H:%M:%S", &tm); snprintf(tzbuf, sizeof(tzbuf), " %+2.2ld%2.2u", -my_timezone / 60, abs(my_timezone) % 60); strcat(buf, tzbuf); /* add +0100 */ strftime(tzbuf, sizeof(tzbuf), " (%Z)", &tm); strcat(buf, tzbuf); /* add (CEST) */ }
Sophon_Int sophon_timezone_offset (Sophon_VM *vm) { return tz_offset(vm); }
static int get_ftm(term_t t, ftm *ftm) { GET_LD term_t tmp = PL_new_term_ref(); int date9; memset(ftm, 0, sizeof(*ftm)); if ( (date9=PL_is_functor(t, FUNCTOR_date9)) ) { if ( get_int_arg (1, t, tmp, &ftm->tm.tm_year) && get_int_arg (2, t, tmp, &ftm->tm.tm_mon) && get_int_arg (3, t, tmp, &ftm->tm.tm_mday) && get_int_arg (4, t, tmp, &ftm->tm.tm_hour) && get_int_arg (5, t, tmp, &ftm->tm.tm_min) && get_float_arg(6, t, tmp, &ftm->sec) && get_voff_arg (7, t, tmp, &ftm->utcoff) && get_tz_arg (8, t, tmp, &ftm->tzname) && get_dst_arg (9, t, tmp, &ftm->isdst) ) { double fp, ip; ftm->tm.tm_isdst = (ftm->isdst == -2 ? -1 : ftm->isdst); fixup: fp = modf(ftm->sec, &ip); if ( fp < 0.0 ) { fp += 1.0; ip -= 1.0; } ftm->tm.tm_sec = (int)ip; ftm->tm.tm_year -= 1900; /* 1900 based */ ftm->tm.tm_mon--; /* 0-based */ if ( ftm->utcoff == NO_UTC_OFFSET ) { if ( ftm->tm.tm_isdst < 0 ) /* unknown DST */ { int offset; if ( mktime(&ftm->tm) == (time_t)-1 ) return PL_representation_error("dst"); ftm->flags |= HAS_WYDAY; offset = tz_offset(); if ( ftm->tm.tm_isdst > 0 ) offset -= 3600; ftm->utcoff = offset; if ( date9 ) /* variable */ { _PL_get_arg(7, t, tmp); if ( !PL_unify_integer(tmp, ftm->utcoff) ) return FALSE; } else { ftm->utcoff = offset; } } if ( ftm->isdst == -2 ) { ftm->isdst = ftm->tm.tm_isdst; _PL_get_arg(9, t, tmp); if ( ftm->isdst < 0 ) { if ( !PL_unify_atom(tmp, ATOM_minus) ) return FALSE; } else { if ( !PL_unify_bool(tmp, ftm->isdst) ) return FALSE; } } if ( !ftm->tzname ) { ftm->tzname = tz_name_as_atom(ftm->isdst); _PL_get_arg(8, t, tmp); if ( PL_is_variable(tmp) && !PL_unify_atom(tmp, ftm->tzname) ) return FALSE; } } succeed; } } else if ( PL_is_functor(t, FUNCTOR_date3) ) { if ( get_int_arg (1, t, tmp, &ftm->tm.tm_year) && get_int_arg (2, t, tmp, &ftm->tm.tm_mon) && get_int_arg (3, t, tmp, &ftm->tm.tm_mday) ) { ftm->tm.tm_isdst = -1; ftm->utcoff = NO_UTC_OFFSET; goto fixup; } } return PL_error(NULL, 0, NULL, ERR_TYPE, ATOM_time, t); }
/** Load a timezone from the timezone info file **/ void load_tzspecs(char *tz){ char filepath[1024]; char *pTzname = 0; FILE *fp = NULL; char buffer[1024]; int linenum = 0; int year = YEAR0; int y; int found; found = 0; tzvalid = 0; pTzname = tz_name(tz); if(pTzname == 0){ THROW("timezone '%s' was not understood by tz_name.", tz); /* TROUBLESHOOT The specific timezone is not valid. Try using a valid timezone or add the desired timezone to the timezone file <code>.../etc/tzinfo.txt</code> and try again. */ } strncpy(current_tzname, pTzname, sizeof(current_tzname)); tzoffset = tz_offset(current_tzname); strncpy(tzstd, tz_std(current_tzname), sizeof(tzstd)); strncpy(tzdst, tz_dst(current_tzname), sizeof(tzdst)); if(find_file(TZFILE, NULL, R_OK,filepath,sizeof(filepath)) == NULL){ THROW("timezone specification file %s not found in GLPATH=%s: %s", TZFILE, getenv("GLPATH"), strerror(errno)); /* TROUBLESHOOT The system could not locate the timezone file <code>tzinfo.txt</code>. Check that the <code>etc</code> folder is included in the '''GLPATH''' environment variable and try again. */ } fp = fopen(filepath,"r"); if(fp == NULL){ THROW("%s: access denied: %s", filepath, strerror(errno)); /* TROUBLESHOOT The system was unable to read the timezone file. Check that the file has the correct permissions and try again. */ } // zero previous DST start/end times for (y = 0; y < sizeof(tszero) / sizeof(tszero[0]); y++){ dststart[y] = dstend[y] = -1; } while(fgets(buffer,sizeof(buffer),fp)){ char *p = NULL; char tzname[32]; SPEC start, end; int form = -1; linenum++; /* wipe comments */ p = strchr(buffer,';'); if(p != NULL){ *p = '\0'; } /* remove trailing whitespace */ p = buffer + strlen(buffer) - 1; while (iswspace(*p) && p > buffer){ *p-- = '\0'; } /* ignore blank lines or lines starting with white space*/ if (buffer[0] == '\0' || iswspace(buffer[0])){ continue; } /* year section */ if(sscanf(buffer, "[%d]", &year) == 1){ continue; } /* TZ spec */ form = sscanf(buffer, "%[^,],M%d.%d.%d/%d:%d,M%d.%d.%d/%d:%d", tzname, &start.month, &start.nth, &start.day, &start.hour, &start.minute, &end.month, &end.nth, &end.day, &end.hour, &end.minute); /* load only TZ requested */ pTzname = tz_name(tzname); if (tz != NULL && pTzname != NULL && strcmp(pTzname,current_tzname) != 0){ continue; } if(form == 1){ /* no DST */ set_tzspec(year, current_tzname, NULL, NULL); found = 1; } else if(form == 11) { /* full DST spec */ set_tzspec(year, current_tzname, &start, &end); found = 1; } else { THROW("%s(%d): %s is not a valid timezone spec", filepath, linenum, buffer); /* TROUBLESHOOT The timezone specification is not valid. Verify the syntax of the timezone spec and that it is defined in the timezone file <code>.../etc/tzinfo.txt</code> or add it, and try again. */ } } if(found == 0){ output_warning("%s(%d): timezone spec '%s' not found in 'tzinfo.txt', will include no DST information", filepath, linenum, current_tzname); } if(ferror(fp)){ output_error("%s(%d): %s", filepath, linenum, strerror(errno)); } else { output_verbose("%s loaded ok", filepath); } fclose(fp); tzvalid = 1; }