getlocaltime里面是没有时区信息的。
你可以这样:
time_t time_utc = 0;
struct tm *p_tm_time;
int time_zone = 0;
p_tm_time = localtime( &time_utc ); //转成当地时间
time_zone = ( p_tm_time->tm_hour > 12 ) ? ( p_tm_time->tm_hour-= 24 ) : p_tm_time->tm_hour;
把0时间转为当地时间,得到的是带时区的结果。
使用 windows API
函数GetTimeZoneInformation可以获得当前时区的相关信息,函数原型为
DWORD GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation);
需要传递一个TIME_ZONE_INFORMATION 结构体指针,此结构体定义为
typedef struct _TIME_ZONE_INFORMATION {
LONG Bias;//以分钟为单位
WCHAR StandardName[ 32 ];//标准时间的名称
SYSTEMTIME StandardDate;
LONG StandardBias;
WCHAR DaylightName[ 32 ];//夏令时的名称
SYSTEMTIME DaylightDate;
LONG DaylightBias;
} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
其中UTC = local time + bias(UTC时间 = 本地时间 + bias),具体含义参看MSDN
例子:
TIME_ZONE_INFORMATION tzi;
GetTimeZoneInformation(tzi);
char strStandName [] = tzi.StandardName;
int zone = tzi.Bias/ -60; //时区,如果是中国标准时间则得到8
#include
#include
#include
void main()
{
time_t rawtime; //time_t时间类
struct tm *timeinfo;
time(&rawtime); //获取时间
timeinfo=localtime(&rawtime); //转为当地时间,tm 时间结构
printf("当前系统时间为:%s\n",asctime(timeinfo));//asctime() 转为标准ASCII时间格式
system("pause");
printf("tsystem(\"paus\")\n");//需要输入转意字符\
return;
}
只说方法,方便后来者:
获取本地时间戳。
获取UTC时间戳。
相减 然后 除以 3600,得到的值就是时区。
Linux 系统上我用的 tm 和time_t ,需要注意一点,tm结构体你改一个的值,其他的都会变。