C ISO 8601中的周数

C ISO 8601中的周数,c,windows,mingw,iso8601,strftime,C,Windows,Mingw,Iso8601,Strftime,我正在尝试使用C获取ISO8601周编号。我的电脑上安装了MinGW。GCC版本为5.3.0。你可以在下面看到我的代码strftime不适用于说明符“%V”。但它可以与说明符“%W”配合使用。但那不是我想要的。我需要ISO 8601格式的年周数 我用两个不同的在线C编译器试过我的代码,它们都运行得很好。我怀疑我电脑上的编译器配置得不好。谁能告诉我我做错了什么?任何帮助都将不胜感激 这是我的密码: #include <stdio.h> #include <time.h> #

我正在尝试使用C获取ISO8601周编号。我的电脑上安装了MinGW。GCC版本为5.3.0。你可以在下面看到我的代码strftime不适用于说明符“%V”。但它可以与说明符“%W”配合使用。但那不是我想要的。我需要ISO 8601格式的年周数

我用两个不同的在线C编译器试过我的代码,它们都运行得很好。我怀疑我电脑上的编译器配置得不好。谁能告诉我我做错了什么?任何帮助都将不胜感激

这是我的密码:

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

int main ()
{
    time_t timep;
    struct tm * time_inf;
    char buff [80];

    time ( &timep );
    time_inf = localtime ( &timep );

    time_inf->tm_year = 2008 - 1900;
    time_inf->tm_mon = 11;
    time_inf->tm_mday = 31;

    mktime ( time_inf );

    strftime (buff, sizeof(buff), "%V", time_inf) ;
    puts (buff); //prints nothing

    printf("%d", strlen(buff)); //prints 0

    return 0;
}
#包括
#包括
#包括
int main()
{
时间;
struct tm*time\u inf;
字符buff[80];
时间(&timep);
time\u inf=本地时间(&timep);
时间->tm\u年=2008-1900;
时间->tm\u mon=11;
时间->tm\u mday=31;
mktime(time_inf);
strftime(buff,sizeof(buff),%V,time\u inf);
放置(buff);//不打印任何内容
printf(“%d”,strlen(buff));//打印0
返回0;
}

MinGW没有提供自己的
strftime
,而是提供MSVCRT定义中的链接

要么实现您自己缺少的内容,要么使用替代实现,例如

使用C获取ISO8601周编号

当使用
strftime()
%V“
不可用或有问题时,代码可以在一周内计算ISO 8601的方向性


ISO 8601一年中的几周从周一开始

当你想找到一年中的年份时,通常也需要相应的“年份”

一年中的第一周,即第1周,是从周一开始的第一周,在一月份至少有4天——或者正如下面的代码所使用的,一年中的第一个星期四是在第1周

12月31日可能在下一年的第一周。
1月1日可能是前一年的第52/53周

#include <time.h>

// return 1 on failure, 0 on success
int tm_YearWeek(const struct tm *tmptr, int *year, int *week) {
  // work with local copy
  struct tm tm = *tmptr;
  // fully populate the yday and wday fields.
  if (mktime(&tm) == -1) {
    return 1;
  }

  // Find day-of-the-week: 0 to 6.
  // Week starts on Monday per ISO 8601
  // 0 <= DayOfTheWeek <= 6, Monday, Tuesday ... Sunday
  int DayOfTheWeek = (tm.tm_wday + (7 - 1)) % 7;

  // Offset the month day to the Monday of the week.
  tm.tm_mday -= DayOfTheWeek;
  // Offset the month day to the mid-week (Thursday) of the week, 3 days later.
  tm.tm_mday += 3;
  // Re-evaluate tm_year and tm_yday  (local time)
  if (mktime(&tm) == -1) {
    return 1;
  }

  *year = tm.tm_year + 1900;
  // Convert yday to week of the year, stating with 1.
  *week = tm.tm_yday / 7 + 1;
  return 0;
}
2008年12月31日或2009年9月1日的产量为2009年第1周。这是根据上面的讨论预期的,并可能解释OP对OP代码的未声明关注

Err:0  Year:2009  Week:1 0901

你的代码对我来说很好。请注意,
%V
格式说明符依赖于区域设置。试试看这个代码,因为代码看起来很好——除了C不是C++。虽然我用一些代码计算了ISO 8601周,但是这里的代码越来越短。我会换成这个。非常感谢。您是否可以在不使用time.h和not use(mktime)的情况下编写解决方案?无法使用该库。@Joel当然,给定
y,m,d
,我们两人都可以编写一个迷你
Joel\u mktime()
。试一试,如果它不总是有效的话,作为一个问题发布,我相信你会得到很好的反馈。@chux如果你能看一看,将不胜感激。谢谢
Err:0  Year:2009  Week:1 0901