Всем привет
Необходимо менять системную дату и время.
OS Debian
Вот код тестовый
#include <iostream>
#include <time.h>
#include <sys/time.h>
using namespace std;
void setTime(int day, int month, int year, int hour, int minute, int second, int mseconds, __timezone_ptr_t tz)
{
struct tm time;
time.tm_mday = day;
time.tm_mon = month - 1;
time.tm_year = year - 1900;
time.tm_hour = hour;
time.tm_min = minute;
time.tm_sec = second;
struct timeval tval;
tval.tv_sec = mktime(&time);
tval.tv_usec = mseconds * 1000;
//settimeofday(&tval, NULL);
settimeofday(&tval, tz);
}
int main(int argc, char *argv[])
{
char* day=0; char* month=0;
char* year=0; char* hour=0;
char* min=0; char* sec=0;
time_t rawtime;
tm * timeinfo;
time( &rawtime ); // получить текущую дату, выраженную в секундах
timeinfo = localtime( &rawtime );
std::cout << "Текущее локальное время и дата (asctime) "
<< asctime(timeinfo); // текущая дата, представленная в нормальной форме
cout << "argc = "<<argc<<"\n";
if(argc>1)
day = argv[1];
if(argc>=2)
month = argv[2];
if(argc>=3)
year = argv[3];
if(argc>=4)
hour = argv[4];
if(argc>=5)
min = argv[5];
if(argc>=6)
sec = argv[6];
std::cout << "Текущее локальное время и дата (ctime) "
<< ctime (&rawtime); // текущая дата, представленная в нормальной форме*/
cout<<"Устанавливаем дату и время: " << (day!=0?atoi(day):timeinfo->tm_mday) <<"/"<<(month!=0?atoi(month):timeinfo->tm_mon)<<"/"<<(year!=0?atoi(year):timeinfo->tm_year)
<<" "<<(hour!=0?atoi(hour):timeinfo->tm_hour)<<":"<<(min!=0?atoi(min):timeinfo->tm_min)<<":"<<(sec!=0?atoi(sec):timeinfo->tm_sec)<<endl;
timeval *tv;
__timezone_ptr_t tz = 0;
gettimeofday (tv, tz);
setTime((day!=0?atoi(day):timeinfo->tm_mday), (month!=0?atoi(month):timeinfo->tm_mon), (year!=0?atoi(year):timeinfo->tm_year),
(hour!=0?atoi(hour):timeinfo->tm_hour), (min!=0?atoi(min):timeinfo->tm_min), (sec!=0?atoi(sec):timeinfo->tm_sec), 0, tz);
time_t rawtime2;
tm * timeinfo2;
time( &rawtime2 ); // получить текущую дату, выраженную в секундах
timeinfo2 = localtime( &rawtime2 );
std::cout << "Новое локальное время и дата (acstime) "
<< asctime(timeinfo2) << endl;
std::cout << "Новое локальное время и дата (ctime) "
<< ctime (&rawtime2) << endl; // текущая дата, представленная в нормальной форме*/
std::cout << "Год: " <<timeinfo2->tm_year << endl;
std::cout << "Месяц: " <<timeinfo2->tm_mon << endl;
std::cout << "День: " <<timeinfo2->tm_mday << endl;
std::cout << "Часы: " <<timeinfo2->tm_hour << endl;
return 0;
}
В итоге устанавливается всё верно кроме часа дня. Т.е. указываешь 16:30:00, а получается 15:30:00
Причем примерно раз на 10 попыток устанавливается корректно то, что указал.
Не понимаю что происходит.
Что делаю неправильно?