C - 从特定日期开始计算分钟数
C - Counting minutes from a specific date
我需要计算自某个日期 (1600) 以来已经过去了多少分钟,但我并不总能得到我想要的结果 expect.The 变量分钟等于零且类型为 long long int.For 例如,对于日期 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;
}
OP 原文有 2 个问题 post:
自
从 1600 年 1 月 1 日 开始计算分钟数 0:00。该月的第一天是自该月开始以来的第 0 天,而不是第 1 天。
// days += d;
days += d - 1;
用年份调用,而不是月份索引
// if (leapYear(i)){
if (leapYear(y)){
建议在 zjistiDny()
和 return 分钟内将 minutes
归零
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] 年.假设 Gregorian calendar
#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;
}
我需要计算自某个日期 (1600) 以来已经过去了多少分钟,但我并不总能得到我想要的结果 expect.The 变量分钟等于零且类型为 long long int.For 例如,对于日期 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;
}
OP 原文有 2 个问题 post:
自
从 1600 年 1 月 1 日 开始计算分钟数 0:00。该月的第一天是自该月开始以来的第 0 天,而不是第 1 天。
// days += d;
days += d - 1;
用年份调用,而不是月份索引
// if (leapYear(i)){
if (leapYear(y)){
建议在 zjistiDny()
和 return 分钟内将 minutes
归零
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] 年.假设 Gregorian calendar
#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;
}