将历史时间转换为GMT

时间:2011-06-27 11:17:09

标签: c++ gmt ctime

我需要将格式为“2011061411322100”的字符串时间转换为GMT - 我的第一次尝试是在下面。然而,问题是时代来自另一台PC并且是历史时期。所以我没有实时获得时间,所以我不能简单地从当地时间到我的代码运行的盒子上获取GMT。

问题是,如果我的代码在时间更改期间运行,时间更改将发生在我的盒子上,但不会发生在我正在获取时间的远程盒子上。但是,我可以随时查询该框以获取当前时间。

所以,提供更多细节:

  1. 我在遥控盒上开始工作
  2. 工作完成
  3. 我有时候与正在运行的工作有关
  4. 我将时间转换为GMT
  5. 如果在1和2之间发生时间变化(夏令时)。我被搞砸了。我的GMT转换将会中断。我想2)我需要获得当前的遥控盒时间,看看是否有> 58分钟的差异,然后将其应用于转换。但我无法找到一种可行的方法。


    string GMTConverter::strToGMT(const string& timeToConvert)
    {
        // Set time zone from TZ environment variable. 
        _tzset();
    
        struct tm tmTime;
    
    
        //2011 06 14 11 32 21 00
         // (strToInt is just a wrapper for atoi) 
        int year = strToint(timeToConvert.substr(0, 4) );
        int month = strToint(timeToConvert.substr(4, 2) );
        int day = strToint(timeToConvert.substr(6, 2) );
        int hour = strToint(timeToConvert.substr(8, 2) );
        int min = strToint(timeToConvert.substr(10, 2) );
        int sec = strToint(timeToConvert.substr(12, 2) );
    
        cout<<"Time after parsing: "<<year<<"/"<<month<<"/"<<day<<" "<<hour<<":"<<min<<":"<<sec<<endl;
    
        // add to tm struct and return
        tmTime.tm_hour = hour; 
        tmTime.tm_min = min; 
        tmTime.tm_sec = sec; 
        tmTime.tm_mday = day; 
        tmTime.tm_mon = (month-1); 
        tmTime.tm_year = (year - 1900); 
    
        cout <<"Time in TM: "<<tmTime.tm_year<<"/"<<tmTime.tm_mon<<"/"<<tmTime.tm_mday<<" "<<tmTime.tm_hour<<":"<<tmTime.tm_min<<":"<<tmTime.tm_sec<<endl;
    
        char currDateTime[64];
    
         // For logging
        strftime(currDateTime, 63, "%c", &tmTime);
        cout <<"Actual time:"<<currDateTime<<endl;
    
        time_t remotePCTime = mktime( &tmTime );
    
        struct tm *gmt = gmtime( &remotePCTime );
        cout << "gmt = " << asctime( gmt ) << endl;
    
        char datebuf_2[12];
        char timebuf_2[13];
        strftime( datebuf_2, 13, "%Y-%m-%d\0", gmt );
        strftime( timebuf_2, 13, "%H:%M:%S\0", gmt );
    
        return string(datebuf_2) + "T" + string(timebuf_2) + "." + string("000");
    }
    

3 个答案:

答案 0 :(得分:2)

明显可靠的解决方案是使用UTC(没有夏令时)来发送您的时间戳。使用具有固有歧义的任何时间系统(每年有一小时的重叠,你可以在不同的时间获得相同的时间戳)将使得不可能有一个万无一失的方法,因为信息丢失。

如果您无法控制远程计算机发送的时间格式,您只能尝试从您拥有的信息中进行推断,例如,如果结束时间低于开始时间,则添加一小时。如果工作时间超过一小时,这又会引起歧义,但至少时间不会倒退。

答案 1 :(得分:1)

时间变化每年出现两次 - 你为什么要打扰?无论如何,你不能改变时间格式来包括时间变化事件吗?或者通过比较时间变化出现的某个固定时间和日期来检查时间变化期间是否完成了工作?

答案 2 :(得分:1)

在远程作业的开头和结尾获取UTC的本地时间。获取远程作业时间并在作业的开始和结束时转换为UTC。将收集的“历史”时间转换为原始帖子中所述的GMT / UTC。将这些数据保存在结构或类中,并为其他开始结束时间提供明确的名称,如LocalDLSValidation等 我们现在必须检查以下情况:

  1. Start and end time delta between Local and Remote is within allowed threshold(50mins?)

这是金案。我们的历史时间收集不需要修改

 2. Local start/end time and remote time delta is outside threshold. 

这是第二个最简单的案例。这意味着我们可以在整个收集时间内+或 - 小时。

 3.Local start time and remote time delta is within threshold.  But end is outside. 

这是我们最糟糕的情况,因为这意味着在我们的工作中发生了变化。如果工作持续时间少于一小时,那么很容易看出我们收藏的时间需要+或 - 一小时。

如果大于1小时...... mmmmm。这是我们遇到问题的地方。

   4.  Start time between local and remote is different but end time is different

根据OP中的用例,不应该发生这种情况。