#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <unistd.h>
/**
*
* TZ环境变量,时区,夏令时
* 当前demon测试环境: 1.32为系统; 2.系统时区是UTC。
*
*/
int main()
{
time_t now = 0; char * TZ = NULL; struct tm *tm_ = NULL; struct timeval tval = {0,0}; struct timezone tzone = {0,0};
TZ = getenv("TZ");
printf("====================================> TZ = %s\n", TZ == NULL?"env TZ not seted" : TZ );
now = time(NULL); //1970到现在的UTC时间的秒数;
printf("time_t = %ld, ctime: = %s", now, ctime(&now) ); //char* ctime(const time_t *timer)返回一个表示当地时间的字符串(包含一个换行符),当地时间是基于参数 timer。
gettimeofday(&tval, &tzone);
printf("gettimeofday tval.tv_sec = %d, tval.tv_usec = %d; tzone.tz_minuteswest = %d, tzone.tz_dsttime = %d.\n", \
tval.tv_sec, tval.tv_usec, tzone.tz_minuteswest, tzone.tz_dsttime);
tm_ = gmtime(&now); //转换成UTC世界时间
printf("gmtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);
tm_ = localtime(&now); //转换成本地时间
printf("localtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);
printf("\n");
setenv("TZ", "CST-8", 1);//设置时区(中国东八区)
TZ = getenv("TZ");
printf("====================================> TZ = %s\n", TZ == NULL?"env TZ not seted" : TZ );
now = time(NULL);
printf("time_t = %ld, ctime: = %s", now, ctime(&now) );
gettimeofday(&tval, &tzone);
printf("gettimeofday tval.tv_sec = %d, tval.tv_usec = %d; tzone.tz_minuteswest = %d, tzone.tz_dsttime = %d.\n", \
tval.tv_sec, tval.tv_usec, tzone.tz_minuteswest, tzone.tz_dsttime);
tm_ = gmtime(&now);
printf("gmtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);
tm_ = localtime(&now);
printf("localtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);
printf("\n");
setenv("TZ", "NZST-12:00:00", 1);//设置时区(新西兰标准时间)
TZ = getenv("TZ");
printf("====================================> TZ = %s\n", TZ == NULL?"env TZ not seted" : TZ );
now = time(NULL);
printf("time_t = %ld, ctime: = %s", now, ctime(&now) );
gettimeofday(&tval, &tzone);
printf("gettimeofday tval.tv_sec = %d, tval.tv_usec = %d; tzone.tz_minuteswest = %d, tzone.tz_dsttime = %d.\n", \
tval.tv_sec, tval.tv_usec, tzone.tz_minuteswest, tzone.tz_dsttime);
tm_ = gmtime(&now);
printf("gmtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);
tm_ = localtime(&now);
printf("localtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);
printf("\n");
/**
*
* NZDT-13:00:00,M10.1.0,M3.3.0
*
* NZST,表示新西兰标准时间;
*
* -12:00:00表示比UTC早12小时;
*
* NZDT,表示新西兰夏时制时间;
*
* -13:00:00,表示夏时制时间比UTC早13小时(即比标准时间快1小时);
*
* M10.1.0,M3.3.0表示夏令时从10月第一个星期日02:00:00开始到3月第三个星期日02:00:00结束。
* ==>m:指一年中的第几月(1 <= m <= 12)。
* ==>w:指一个月中的第几周(1 <= w <= 5),1表示第一周,5表示最后一周。
* ==>d:指一周中的第几天(0 <= d <= 6),0表示星期天。
* ==>time:该字段表示本地时间对夏时制生效或结束的时间,如果省略默认为02:00:00。
*
*/
setenv("TZ", "NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0", 1);//设置时区(新西兰夏令时时间)
TZ = getenv("TZ");
printf("====================================> TZ = %s\n", TZ == NULL?"env TZ not seted" : TZ );
//while(1)
{
now = time(NULL);
printf("time_t = %ld, ctime: = %s", now, ctime(&now) );
gettimeofday(&tval, &tzone);
printf("gettimeofday tval.tv_sec = %d, tval.tv_usec = %d; tzone.tz_minuteswest = %d, tzone.tz_dsttime = %d.\n", \
tval.tv_sec, tval.tv_usec, tzone.tz_minuteswest, tzone.tz_dsttime);
tm_ = gmtime(&now);
printf("gmtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);
tm_ = localtime(&now);
printf("localtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);
printf("\n");
sleep(5);
}
return 0;
}