2

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

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

因此,要提供更多详细信息:

  1. 我在远程盒子上开始工作
  2. 作业完成
  3. 我得到了一些与正在运行的工作相关的时间
  4. 我将时间转换为 GMT

如果在 1. 和 2. 之间发生时间变化(夏令时)。我搞砸了。我的 GMT 转换将中断。我想在 2) 之后我需要获取当前的 Remote Box 时间,看看是否有 > 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");
}
4

3 回答 3

2

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

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

于 2011-06-27T12:16:39.427 回答
1

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

于 2011-06-27T12:04:41.237 回答
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 中的用例,这不应该发生。

于 2011-06-28T00:03:14.017 回答