【问题标题】:Can someone explain to me why time is working like this?有人可以向我解释为什么时间会这样工作吗?
【发布时间】:2018-04-09 06:17:53
【问题描述】:

我已经为此花费了一个小时,但我无法创建适用于我的 c 程序的公式。 (我有一个新程序员)。

我必须将 UTC 时间转换为特定城市的相应时间。除了这里,我的代码运行良好。在这里它给了我错误的答案。我无法理解它(我创建了一个公式,但它对我来说毫无意义)。

在我的程序中,时间输入为 24 小时制。上午 9 点 = 900,下午 12 点 = 1200,上午 12 点 = 0 等等。

如果我们被要求将 2359 转换为欧克拉时间 (UTC +845),我的程序输出 804。正确答案是 844。 我想出了如何计算 844,但我不明白。

2359 + 845 = 3204 (adding the timezone offset 845 to the UTC time)
3204 - 60 = 3144 (minus 60 for some reason [I followed my time overflow formula]
3144 - 2400 = 2400 (minus 2400 because time cannot be more than 2359)

我的程序是如何工作的

首加UTC和偏移时间

calculatedTime = UTC + offset;

然后在那个下面

if (calculatedTime < 2359) {
calculatedTime = calculatedTime - 2400;
}

我还有另一个函数可以检查下面的溢出时间

if (((calculatedTime > 59) && (calculatedTime < 99)) || ((calculatedTime > 159) && (calculatedTime < 199))) {

// All the way to 2359

calculatedTime = calculatedTime - 60 + 100;

}

【问题讨论】:

  • 您不能只决定时间,即以 60 为底,以 100 为底计算。如果现在时间是 23:59,而您等待两分钟,那么是 23:61 吗?要么将其转换为实际分钟数,要么分别计算分钟和小时。
  • @SamiKuhmonen 是的,这就是我不明白的,我如何将它转换为 base 60,同时让我的所有其他代码工作?现在,我的代码运行良好,除了这个特定的时间/偏移量之外,它还能正确转换所有内容。顺便一提。我更新了我的第一篇文章
  • 它不是很好,而是适用于非常具体的事情。你知道如何使用模数和除法吗?使用这些分隔小时和分钟。
  • 不确定你是否在做作业,但你能使用任何标准的c time 函数吗?可能会帮助explain_time ;)

标签: c if-statement time calculator


【解决方案1】:

您需要将时间分成小时和分钟。然后将时区偏移量分别添加到小时和分钟。处理翻车。最后,将小时和分钟重新组合成最终答案。

像这样:

int main(void)
{
    // inputs
    int time = 2359;
    int zone =  845;

    // separate hours and minutes
    int timeHours = time / 100;
    int timeMinutes = time % 100;
    int zoneHours = zone / 100;
    int zoneMinutes = zone % 100;

    // add the hours and minutes
    int hours = timeHours + zoneHours;
    int minutes = timeMinutes + zoneMinutes;

    // handle the rollover conditions
    if (minutes > 60) {
        minutes -= 60;
        hours++;
    }
    if (hours > 24) {
        hours -= 24;
    }

    // recombine the hours and minutes
    int adjustedTime = hours * 100 + minutes;
    printf("%d\n", adjustedTime);
}

请注意,此代码仅适用于具有正偏移的时区。您需要弄清楚如何使其适用于负时区。

【讨论】:

    【解决方案2】:

    OP 的代码有各种错误。

    // if (((calculatedTime > 59) && (calculatedTime < 99)) || 
    //    ((calculatedTime > 159) && (calculatedTime < 199))) {
    if (((calculatedTime > 59) && (calculatedTime < 100)) || 
        ((calculatedTime > 159) && (calculatedTime < 200))) {
    
    // if (hours > 24) {
    //     hours -= 24;
    // }
    if (hours >= 24) {
        hours -= 24;
    }
    

    使用60, 100之类的值,代码也更加清晰

    if (((calculatedTime >= 60) && (calculatedTime < 100)) || 
        ((calculatedTime >= 60*2) && (calculatedTime < 100*2))) {
    

    然而 OP 的方法因负数而失败。

    要处理正负时间值,请将“hhmm”时间拆分为小时和分钟。寻找“分钟”溢出的条件。我推荐 2 个辅助函数来拆分和合并结果。

    #include <stdio.h>
    #include <stdlib.h>
    
    void hhmm_split(int hhmm, int *hour, int *min) {
      *hour = hhmm / 100;
      *min = hhmm % 100;
    }
    
    /* `min` may be outside the primary range of (-60 ... 60) */
    int hhmm_combine(int hour, int min) {
      hour += min / 60;
      min %= 60;
      if (hour < 0 && min > 0) {
        min -= 60;
        hour++;
      } else if (hour > 0 && min < 0) {
        min += 60;
        hour--;
      }
      hour %= 24;
      return hour * 100 + min;
    }
    

    测试代码

    void hhmm_add(int t1, int t2) {
      int t1_hh, t1_mm, t2_hh, t2_mm;
      hhmm_split(t1, &t1_hh, &t1_mm);
      hhmm_split(t2, &t2_hh, &t2_mm);
      int sum = hhmm_combine(t1_hh + t2_hh, t1_mm + t2_mm);
      printf("t1:% 05d + t2:% 05d = sum:% 05d\n", t1, t2, sum);
    }
    
    int main(void) {
      hhmm_add(2359, 845);
      hhmm_add(2359, -845);
      hhmm_add(-2359, 845);
      hhmm_add(-2359, -845);
    }
    

    输出:

    t1: 2359 + t2: 0845 = sum: 0844
    t1: 2359 + t2:-0845 = sum: 1514
    t1:-2359 + t2: 0845 = sum:-1514
    t1:-2359 + t2:-0845 = sum:-0844
    

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多