gpt4 book ai didi

C++ 从周数和星期几获取 ISO8601 天数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:57 28 4
gpt4 key购买 nike

我有:

  • 年份数字(可以是任何年份)
  • 月份数(从一月到十二月)
  • 周数(第 1、2、3、4、最后)
  • 工作日(周日、周一、周二、周三、周四、周五、周六)

我需要获取天数 [从 1 到 ~31] - "YYYY-MM-DD"( ISO8601 )。

有什么方法可以使用 boost posix time 或使用其他一些 C++ 库来计算吗?

  • 2014 年,三月的第一个星期天 - 那就是 2014-03-02
  • 2014 年,12 月的第 4 个星期三 - 即 2014 年 12 月 24 日

谢谢。

最佳答案

我写了一个轻量级的C library可以做你想做的,有趣的部分是here ,如您所见,该算法很简单。

#include <stdio.h>
#include <stdint.h>
#include "dt_dow.h"
#include "dt_accessor.h"

const struct test {
int year;
int month; /* Month of the year [1=Jan, 12=Dec] */
int nth; /* Occurrence within month */
dt_dow_t dow; /* Day of the week [1=Mon, 7=Sun] */
int dom; /* Expected day of the month [1, 31] */
} tests[] = {
{ 2014, 3, 1, DT_SUNDAY, 2 },
{ 2014, 4, -1, DT_TUESDAY, 29 },
{ 2014, 4, -2, DT_MONDAY, 21 },
{ 2014, 4, -5, DT_TUESDAY, 1 },
{ 2014, 4, 1, DT_TUESDAY, 1 },
{ 2014, 12, 4, DT_WEDNESDAY, 24 },
};

int
main() {
int i, ntests;

ntests = sizeof(tests) / sizeof(*tests);
for (i = 0; i < ntests; i++) {
const struct test t = tests[i];

{
int dom = dt_dom(dt_from_nth_dow_in_month(t.year, t.month, t.nth, t.dow));

if (t.dom != dom) {
printf("dt_dom(dt_from_nth_dow_in_month(%d, %d, %d, %d))\n",
t.year, t.month, t.nth, t.dow);
printf(" got: %d\n", dom);
printf(" exp: %d\n", t.dom);
}
}
}
return 0;
}

如果你不想使用上面的库/代码,这里是一个重新实现。

#include <stdio.h>
#include <assert.h>
#include <stdint.h>
#include <stdbool.h>

bool
leap_year(int y) {
return ((y % 4) == 0 && (y % 100 != 0 || y % 400 == 0));
}

int
days_in_month(int y, int m) {
static const int T[2][13] = {
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
assert(m >= 1);
assert(m <= 12);
return T[leap_year(y)][m];
}

/* Computes the day of the week [1=Mon, 7=Sun] from the given year, month, day. */
int
ymd_to_dow(int y, int m, int d) {
static const int T[13] = { 0, 6, 2, 1, 4, 6, 2, 4, 0, 3, 5, 1, 3 };

assert(y >= 1);
assert(m >= 1);
assert(m <= 12);
assert(d >= 1);

y -= m < 3;
return 1 + (y + y/4 - y/100 + y/400 + T[m] + d) % 7;
}

int
dom_from_nth_dow_in_month(int y, int m, int nth, int dow) {
int dim, dom;

assert(y >= 1);
assert(m >= 1);
assert(m <= 12);
assert(dow >= 1);
assert(dow <= 7);

dim = days_in_month(y, m);
if (nth > 0) {
dom = 1;
dom += (dow - ymd_to_dow(y, m, dom) + 7) % 7;
dom += --nth * 7;
if (dom <= dim)
return dom;
}
else if (nth < 0) {
dom = dim;
dom -= (ymd_to_dow(y, m, dom) - dow + 7) % 7;
dom -= ++nth * -7;
if (dom >= 1)
return dom;
}
return -1;
}

const struct test {
int year;
int month; /* Month of the year [1=Jan, 12=Dec] */
int nth; /* Occurrence within month */
int dow; /* Day of the week [1=Mon, 7=Sun] */
int dom; /* Expected day of the month [1, 31] */
} tests[] = {
{ 2014, 3, 1, 7, 2 },
{ 2014, 4, -1, 2, 29 },
{ 2014, 4, -2, 1, 21 },
{ 2014, 4, -5, 2, 1 },
{ 2014, 4, 1, 2, 1 },
{ 2014, 12, 4, 3, 24 },
};

int
main() {
int i, ntests;

ntests = sizeof(tests) / sizeof(*tests);
for (i = 0; i < ntests; i++) {
const struct test t = tests[i];

{
int dom = dom_from_nth_dow_in_month(t.year, t.month, t.nth, t.dow);

if (t.dom != dom) {
printf("dom_from_nth_dow_in_month(%d, %d, %d, %d))\n",
t.year, t.month, t.nth, t.dow);
printf(" got: %d\n", dom);
printf(" exp: %d\n", t.dom);
}
}
}
return 0;
}

关于C++ 从周数和星期几获取 ISO8601 天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23083206/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com