话不多说,具体函数封装如下:
Set_time.h文件
#ifndef SET_TIME_H_
#define SET_TIME_H_
typedef struct {
int year;
int month;
int day;
int hour;
int minute;
int second;
int msec;
} TIME;
class CSystemTime
{
public:
static CSystemTime* getInstance();
/*
* 设置系统时间(当地时间)
* 需要管理员权限才能成功设置
* 设置失败返回false
* 设置成功返回true
*/
bool setSystemTime(TIME *_time);
/*获取系统国际标准时间*/
TIME* getSystemUTCTime();
/*获取系统当地时间*/
void getSystemLocalTime(TIME* getTime);
private:
CSystemTime();
virtual ~CSystemTime();
static CSystemTime* instance;
};
#endif // CSYSTIME_H
Set_time.cpp文件
#include "Set_time.h"
#include <time.h>
#include <sys/time.h>
#include <stdio.h>
#include <sys/timeb.h>
CSystemTime* CSystemTime::instance = NULL;
CSystemTime* CSystemTime::getInstance()
{
if(instance==NULL)
instance=new CSystemTime();
return instance;
}
CSystemTime::CSystemTime()
{
}
CSystemTime::~CSystemTime()
{
}
bool CSystemTime::setSystemTime(TIME *_time)
{
struct tm *p = new struct tm();
struct timeval tv;
struct timezone tz;
gettimeofday (&tv , &tz);//获取时区保存tz中
p->tm_year = _time->year - 1900;
p->tm_mon = _time->month - 1;
p->tm_mday = _time->day;
p->tm_hour = _time->hour;
p->tm_min = _time->minute;
p->tm_sec = _time->second;
time_t utc_t = mktime(p);
delete(p);
tv.tv_sec = utc_t;
tv.tv_usec = 0;
if (settimeofday(&tv, &tz) < 0)
{
return false;
}
return true;
}
TIME* CSystemTime::getSystemUTCTime()
{
TIME *t = new TIME();
time_t timep;
struct tm *p;
time(&timep);
p = gmtime(&timep); //获取UTC时间
t->year = 1900 + p->tm_year;
t->month = 1 + p->tm_mon;
t->day = p->tm_mday;
t->hour = p->tm_hour;
t->minute = p->tm_min;
t->second = p->tm_sec;
// t->year = 1900 + 2022;
// t->month = 2;
// t->day = 2;
// t->hour = 2;
// t->minute = 2;
// t->second = 2;
return t;
}
void CSystemTime::getSystemLocalTime(TIME* getTime)
{
if(getTime == NULL)
return;
TIME *t = getTime;
time_t timep;
struct tm *p;
struct timeb mt;
ftime(&mt);
time(&timep);
p = localtime(&timep); //取得当地时间
t->year = 1900 + p->tm_year;
t->month = 1 + p->tm_mon;
t->day = p->tm_mday;
t->hour = p->tm_hour;
t->minute = p->tm_min;
t->second = p->tm_sec;
t->msec = mt.millitm;
return ;
}