首页 > 解决方案 > C - 从特定日期开始计算分钟数

问题描述

我需要计算自某个日期 (1600) 以来经过了多少分钟,但我并不总是得到我期望的结果。变量分钟等于零并且类型为 long long int。例如,对于日期2:18 10/14/1900,我将介绍 158093418 而不是 158197098 等。

#include <stdio.h>
 
int leapYear (int y) {
    if ( y % 4 == 0 && ( y % 100 != 0 || y % 400 == 0 ))
        return 1;
    return 0;
}

void zjistiDny (int y, int m, int d, int h, int i, long long int *minutes)
{
    int mesic [13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    long long int days = 0;
    
    for ( int i = 1600; i < y; i++ )
    {
        days += 365;
        if (leapYear(y)){
            days += 1;
        }

    }
    
    for ( int i = 1; i <m; i++)
    {
        if (i != 2)
        {
            days += mesic[i];
        }
        else
        {
            if (leapYear(y))
            {
                days += 1;
            }
            days += mesic[i];
        } 
    
            
    }

    days += d;
    *minutes += days*1440;
    *minutes += h*60;
    *minutes += i;
        
}

int main () 
{
    long long int minutes1 = 0, minutes2 = 0, minutes = 0;
    int y1 = 1900, m1= 10, d1 = 14, h1 = 2, i1 = 18;
    int y2 = 1950, m2= 11, d2 = 27, h2 = 6, i2 = 53;
    
    zjistiDny(y1,m1,d1,h1,i1,&minutes1);
    zjistiDny(y2,m2,d2,h2,i2,&minutes2);
    
    printf("minuty1: %lld\n", minutes1);
    printf("minuty1: %lld\n", minutes2);
    return 0;
 }

标签: cpointerstimecountinteger

解决方案


OP原始帖子中的2个问题:

自从

1600 年 1 月 1 日 0:00开始计算分钟数。该月的第一天是自月初以来的零天,而不是 1。

// days += d;
days += d - 1;

使用年份而不是月份索引调用

// if (leapYear(i)){
if (leapYear(y)){

建议归零minuteszjistiDny()返回分钟

long long zjistiDny (int y, int m, int d, int h, int i) {
  long long minutes = 0;
  ...
  minutes += days*1440;
  minutes += h*60;
  minutes += i;
  return minutes;
}

<time.h>使用和假设的替代代码time_t是自 1970/1/1 0:00:00 以来的秒数,并且mktime()适用于多年 [2000-2399]。假设公历

#include <time.h>
#define DAYSPER400YEARS (400L * 365 + 100 - 3)
#define MINSPER400YEARS (DAYSPER400YEARS * 24LL * 60)

long long minutes(int year, int mon, int day, int hour, int min) {
  int year400since2000 = year/400 - 5;
  year = year%400 + 2000;
  struct tm tm = {0};
  tm.tm_year = year - 1900;
  tm.tm_mon = mon - 1;
  tm.tm_mday = day;
  tm.tm_mday = day;
  tm.tm_hour = hour;
  tm.tm_min = min;
  time_t t = mktime(&tm);
  assert(t != -1);
  t /= 60;
  t += year400since2000 * MINSPER400YEARS;
  return t;
}

推荐阅读