c - 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;
}
解决方案
OP原始帖子中的2个问题:
自从
从1600 年 1 月 1 日 0:00开始计算分钟数。该月的第一天是自月初以来的零天,而不是 1。
// days += d;
days += d - 1;
使用年份而不是月份索引调用
// if (leapYear(i)){
if (leapYear(y)){
建议归零minutes
并zjistiDny()
返回分钟
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;
}
推荐阅读
- python - 按 id 过滤 TensorFlow 数据集
- python - 如何以相反的顺序获取numpy多维数组的索引?
- python - 如何根据列值和行值连接两个df?
- c# - C# utf 字符串转换,无法正确显示的字符被转换为“未知字符” - 如何防止这种情况?
- go - 如何在此 Go 频道为空之前取消订阅?
- python - 如何将函数添加到 eval 函数的全局列表中?
- java - 将spring boot lib文件夹移到jar之外
- java - 移动没有窗口标题栏的 JFrame
- excel - 过滤使用数据模型 vba 创建的数据透视表的非空白单元格
- haskell - 创建新的子类