在过去的几个小时里,我一直在试图弄清楚如何用 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 ;
我走不动了。我需要帮助。
答案 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 添加到 d
的 y, 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