从开始日期和C中的天数计算结束日期

时间:2021-01-27 21:47:47

标签: c date console-application

在过去的几个小时里,我一直在试图弄清楚如何用 C 编写程序来根据开始日期和天数计算结束日期。 (我还没有找到解决这个确切问题的论坛)。 假设您输入 27/1/2021 作为开始日期,然后输入 380 天。该程序现在应该计算并显示结束日期 11/2/2022。 我不知道如何前进,将不胜感激。

DELIMITER $$

create trigger new_invoice
after insert
on main for each row
begin
if new.RecordID is not null then
insert into invoice(RecordID)
values(new.RecordID(new.RecordID));
END IF;

END$$
DELIMITER ;

我走不动了。我需要帮助。

2 个答案:

答案 0 :(得分:2)

<块引用>

假设您输入 27/1/2021 作为开始日期,然后输入 380 天。该程序现在应该计算并显示结束日期 11/2/2022。

一种简单的方法是使用 mktime() 将日期带入其标准范围。

#include <stdio.h>
#include <time.h>

int main(void) {
  struct tm start = {.tm_year = 2021 - 1900, .tm_mon = 1 - 1, .tm_mday = 27,
      .tm_hour = 12};  // Midday to avoid DST issues.
  start.tm_mday += 380;
  printf("%d/%d/%d\n", start.tm_mday, start.tm_mon + 1, start.tm_year + 1900);
  time_t t = mktime(&start);
  printf("%d/%d/%d %s\n", start.tm_mday, start.tm_mon + 1, start.tm_year + 1900, 
      t == -1 ? "failed" : "OK");
}

输出

407/1/2021
11/2/2022 OK

否则使用离散代码,实际上是重写 mktime() 的年/月/日部分。

答案 1 :(得分:0)

<块引用>

我不知道如何前进,将不胜感激。

将 380 添加到 dy, m, d。在其他情况下,可能会为 m 添加一些值。然后执行基本的范围缩小。每年有12个月。月份范围 [1...12]。每400年有365*400+97天。月中的第 1 天至少为 1。

最后一步是处理月份范围之外的一天。 一个简单的、虽然效率低下的方法:测试数据是否超过该月的天数。如果是这样,减去该月的天数,并提前到下个月。

我遗漏了一些代码细节,因为 OP 的目标是一些前进的想法。

#define DAYSPER400YEARS (365 * 400 + 97)
#define JANUARY 1
#define FEBRUARY 2
#define DECEMBER 12
#define MONTHPERYEAR 12

static int is_leap_year(long long year) {
  // If not divisible by 4 ...
  // If not divisible by 100 ...
  // If not divisible by 400 ...
}

static int days_per_month(long long year, int month) {
  static const signed char dpm[] = { 0, //
      31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  if (month != FEBRUARY) {
    return ....;
  }
  return .... + is_leap_year(year);
}

/*
 * Bring a date into it primary range.
 * https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar
 * The year, month, day may be any value INT_MIN ... INT_MAX.
 * Return error flag.
 */
bool ymd_to_primary_range(int *year, int *month, int *day) {
  long long y = *year;
  y += *month / 12;
  *month %= 12; // month now in -11 to 11 range
  while (*month < JANUARY) {
    *month += MONTHPERYEAR;
    year--;
  }
  y += (*day / DAYSPER400YEARS) * 400;
  *day %= DAYSPER400YEARS;
  while (*day < 1) {
    *day += DAYSPER400YEARS;
    y -= 400;
  }
  int dpm;
  while (*day > (dpm = days_per_month(y, *month))) {
    *day -= dpm; 
    (*month)++;
    if (*month > ...) {
      *month -= ....;
      y++;
    }
  }
  if (y < INT_MIN) {
    *year = INT_MIN;
    return true;
  }
  if (y > INT_MAX) {
    *year = INT_MAX;
    return true;
  }
  *year = (int) y;
  return false;
}

简单

int main(void) {
  int y = 2021;
  int m = 1;
  int d = 27;
  d += 380;
  printf("Error: %d\n", ymd_to_primary_range(&y, &m, &d));
  printf("Date (dmy): %2d/%02d/%04d\n", d, m, y);
}

输出

Error: 0
Date (dmy): 11/02/2022