Time-Local-TZ
view release on metacpan or search on metacpan
# define SAFE_PUTENV_ON() PL_use_safe_putenv = 1;
#else
# define SAFE_PUTENV_ON()
#endif
#ifdef sun
#define asctime_r(a, b) asctime_r(a, b, TIME_STRING_SIZE)
#endif
#ifdef WIN32
#define setenv(name, value, flag) _putenv_s(name, value)
#define unsetenv(name) _putenv_s(name, "")
#define localtime_r(time, tm) localtime_s(tm, time)
#define asctime_r(tm, time_string) asctime_s(time_string, TIME_STRING_SIZE, tm)
#define gmtime_r(time, tm) gmtime_s(tm, time)
#endif
#define BACKUP_TZ() \
SAFE_PUTENV_ON(); \
char* old_tz_p = getenv("TZ"); \
int envsize = old_tz_p == NULL ? 1 : strlen(old_tz_p)+1; \
char old_tz[envsize]; \
if (old_tz_p != NULL) \
memcpy(old_tz, old_tz_p, envsize); \
#define RESTORE_TZ() \
if (old_tz_p == NULL) { \
unsetenv("TZ"); \
} else { \
setenv("TZ", old_tz, 1); \
} \
MODULE = Time::Local::TZ PACKAGE = Time::Local::TZ
PROTOTYPES: DISABLE
void
tz_localtime(tz, time)
char* tz
time_t time
PREINIT:
char time_string[TIME_STRING_SIZE];
struct tm tm;
PPCODE:
BACKUP_TZ();
setenv("TZ", tz, 1);
tzset();
localtime_r(&time, &tm);
RESTORE_TZ();
if (GIMME_V == G_ARRAY) {
EXTEND(SP, 9);
ST(0) = sv_2mortal(newSViv(tm.tm_sec));
ST(1) = sv_2mortal(newSViv(tm.tm_min));
ST(2) = sv_2mortal(newSViv(tm.tm_hour));
ST(3) = sv_2mortal(newSViv(tm.tm_mday));
tm.tm_min = SvIV(ST(2));
tm.tm_hour = SvIV(ST(3));
tm.tm_mday = SvIV(ST(4));
tm.tm_mon = SvIV(ST(5));
tm.tm_year = SvIV(ST(6));
tm.tm_wday = -1;
tm.tm_yday = -1;
tm.tm_isdst = -1;
BACKUP_TZ();
setenv("TZ", tz, 1);
tzset();
time = mktime(&tm);
RESTORE_TZ();
ST(0) = sv_2mortal(newSViv((IV)time));
XSRETURN(1);
void
tz_truncate(tz, time, unit)
char* tz
time_t time
int unit
PREINIT:
struct tm tm;
PPCODE:
if (unit < 1 || unit > 5)
croak("Usage: tz_truncate(tz, time, unit), unit should be 1..5");
BACKUP_TZ();
setenv("TZ", tz, 1);
tzset();
localtime_r(&time, &tm);
if (unit == 5) tm.tm_mon = 0;
if (unit >= 4) tm.tm_mday = 1;
if (unit >= 3) tm.tm_hour = 0;
if (unit >= 2) tm.tm_min = 0;
if (unit >= 1) tm.tm_sec = 0;
time = mktime(&tm);
RESTORE_TZ();
void
tz_offset(tz, time)
char* tz
time_t time
PREINIT:
struct tm tm;
time_t time_utc;
PPCODE:
BACKUP_TZ()
setenv("TZ", tz, 1);
tzset();
gmtime_r(&time, &tm);
time_utc = mktime(&tm);
RESTORE_TZ();
ST(0) = sv_2mortal(newSViv((int)(time-time_utc)));
XSRETURN(1);
magic_regdata_cnt|||
magic_regdatum_get|||
magic_regdatum_set|||
magic_scalarpack|||
magic_set_all_env|||
magic_setarylen|||
magic_setcollxfrm|||
magic_setdbline|||
magic_setdebugvar|||
magic_setdefelem|||
magic_setenv|||
magic_sethint|||
magic_setisa|||
magic_setlvref|||
magic_setmglob|||
magic_setnkeys|||
magic_setpack|||
magic_setpos|||
magic_setregexp|||
magic_setsig|||
magic_setsubstr|||
my_fflush_all||5.006000|
my_fork||5.007003|n
my_kid|||
my_lstat_flags|||
my_lstat||5.024000|
my_memcmp|||n
my_memset|||n
my_pclose||5.003070|
my_popen_list||5.007001|
my_popen||5.003070|
my_setenv|||
my_setlocale|||
my_snprintf|5.009004||pvn
my_socketpair||5.007003|n
my_sprintf|5.009003||pvn
my_stat_flags|||
my_stat||5.024000|
my_strerror||5.021001|
my_strftime||5.007002|
my_strlcat|5.009004||pn
my_strlcpy|5.009004||pn
( run in 0.668 second using v1.01-cache-2.11-cpan-a1d94b6210f )