【问题标题】:set system date and time within c++ program in linux在linux中的c ++程序中设置系统日期和时间
【发布时间】:2013-08-28 08:35:13
【问题描述】:

在我的程序中,用户以 extjs 形式选择日期和时间,然后数据将发送到服务器端(c++ 程序)。在服务器程序中,日期和时间将应用到系统中,如下所示:

int main(){
    string date = "2013-08-28T00:00:00";
    string newtime = "09:12";
    time_t mytime = time(0);
      struct tm* tm_ptr = localtime(&mytime);

      if (tm_ptr)
      {
        tm_ptr->tm_mon  = atoi(date.substr(5,2).c_str()) - 1;
        tm_ptr->tm_mday = atoi(date.substr(8,2).c_str());
        tm_ptr->tm_year = atoi(date.substr(0,4).c_str());
        tm_ptr->tm_min  = atoi(newtime.substr(3,2).c_str());
        tm_ptr->tm_hour  = atoi(newtime.substr(0,2).c_str());
        printf("%d\n%d\n%d\n%d\n%d\n", tm_ptr->tm_mon,tm_ptr->tm_mday,tm_ptr->tm_year,tm_ptr->tm_min,tm_ptr->tm_hour);
        const struct timeval tv = {mktime(tm_ptr), 0};
        settimeofday(&tv, 0);
    }
    return 0;
}

但是当运行这段代码时系统崩溃了! 我还有另一个应用日期和时间的代码:

int main(){
    string date = "2013-08-28T00:00:00";
    string newtime = "09:12";
    string newdate = "";
    string monthnum = date.substr(5,2);
    string month = "";
    if(strcmp(monthnum.c_str(),"01") == 0)         month = "Jan";
    else if(strcmp(monthnum.c_str(),"02") == 0)     month = "Feb";
    else if(strcmp(monthnum.c_str(),"03") == 0)     month = "Mar";
    else if(strcmp(monthnum.c_str(),"04") == 0)     month = "Apr";
    else if(strcmp(monthnum.c_str(),"05") == 0)     month = "May";
    else if(strcmp(monthnum.c_str(),"06") == 0)     month = "Jun";
    else if(strcmp(monthnum.c_str(),"07") == 0)     month = "Jul";
    else if(strcmp(monthnum.c_str(),"08") == 0)     month = "Aug";
    else if(strcmp(monthnum.c_str(),"09") == 0)     month = "Sep";
    else if(strcmp(monthnum.c_str(),"10") == 0)     month = "Oct";
    else if(strcmp(monthnum.c_str(),"11") == 0)     month = "Nov";
    else if(strcmp(monthnum.c_str(),"12") == 0)     month = "Dec";
    newdate = "\"" + month + " " + date.substr(8,2) + " " + date.substr(0,4) + " " + newtime + "\"";
    system("date --set newdate");
    return 0;
}

运行此代码时发生错误,如下所示: 日期:无效日期“newdate”

我看不懂这些代码的问题!

【问题讨论】:

  • 对于崩溃,请在调试器中运行您的程序。对于newdate 问题,请考虑如何将变量的值放入字符串中。
  • 根据用户输入设置日期听起来像是灾难的秘诀。请考虑正确配置 NTP
  • 请远离键盘。
  • 您确定您有足够的权限来设置系统时间吗?普通用户不会。

标签: c++ linux date time


【解决方案1】:

“无效日期”部分是因为它实际上执行了“date --set newdate”。您希望它执行“date --set [newdate 变量的值]”。


改变

system("date --set newdate");

string cmd = "date --set ";
cmd += newdate;
system(cmd.c_str());

【讨论】:

  • 这不会变成std::string吗?请记住,system 采用旧的 C 样式字符串。
  • 这可能是正确的——我显然有点生疏了。将尝试挖掘出正确的语法。
  • @JoachimPileborg 谢谢。当我尝试编译和运行它时更改为实际工作的东西。
  • system( ("date --set " + newdate).c_str() ); 有什么问题?
  • @mvp 我完全同意。我只是在评论上面提出的解决方案。在实践中,我会尝试确定为什么使用 settimeofday 的 OP 解决方案不起作用。
【解决方案2】:

sprintf 可以是另一种选择...

sprintf(newdate,"date --set %s %s %s %s", month, date.substr(8,2), date.substr(0,4), newtime);
system(newdate);

只需检查变量是否为string 类型或upur 平台支持sprintf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2013-09-29
    相关资源
    最近更新 更多