C程序查找给定日期的星期几

the*_*ick 13 c

有没有办法在一行C代码中查找给定日期的星期几?

例如

鉴于19-05-2011(dd-mm-yyyy)给了我星期四

小智 24

正如维基百科所报道的,1990年迈克尔基思和汤姆克拉弗发表了一个表达式,以尽量减少进入一个自包含函数所需的击键次数,将格里高利日期转换为一周中的数字日.

表达式确实既不保留y也不d,并返回表示日期的从零开始的索引,从星期日开始,即如果日期是星期一,则表达式返回1.

使用表达式的代码示例如下:

int d    = 15   ; //Day     1-31
int m    = 5    ; //Month   1-12`
int y    = 2013 ; //Year    2013` 

int weekday  = (d += m < 3 ? y-- : y - 2, 23*m/9 + d + 4 + y/4- y/100 + y/400)%7;  
Run Code Online (Sandbox Code Playgroud)

该表达式使用逗号运算符,如本答案中所述.

请享用!;-)


mae*_*ics 16

单线程不太可能,但strptime函数可用于解析您的日期格式,并且struct tm可以在自动修改这些字段的系统上查询其tm_wday成员的参数(例如,一些glibc实现).

int get_weekday(char * str) {
  struct tm tm;
  memset((void *) &tm, 0, sizeof(tm));
  if (strptime(str, "%d-%m-%Y", &tm) != NULL) {
    time_t t = mktime(&tm);
    if (t >= 0) {
      return localtime(&t)->tm_wday; // Sunday=0, Monday=1, etc.
    }
  }
  return -1;
}
Run Code Online (Sandbox Code Playgroud)

或者你可以编码这些规则来在一个很长的单行中做一些算术:

  • 1900年1月1日是星期一.
  • 三十天是九月,四月,六月和十一月; 所有其他人都有三十一人,仅仅拯救二月,二十八岁,风雨无阻,闰年二十九岁.
  • 闰年发生在任何一年,可被4整除,但除非可被400整除,否则不会在一个世纪上.

编辑:请注意,此解决方案仅适用于UNIX纪元(1970-01-01T00:00:00Z)之后的日期.


pmg*_*pmg 6

这是基于维基百科关于朱利安日的文章的C99版本

#include <stdio.h>

const char *wd(int year, int month, int day) {
  /* using C99 compound literals in a single line: notice the splicing */
  return ((const char *[])                                         \
          {"Monday", "Tuesday", "Wednesday",                       \
           "Thursday", "Friday", "Saturday", "Sunday"})[           \
      (                                                            \
          day                                                      \
        + ((153 * (month + 12 * ((14 - month) / 12) - 3) + 2) / 5) \
        + (365 * (year + 4800 - ((14 - month) / 12)))              \
        + ((year + 4800 - ((14 - month) / 12)) / 4)                \
        - ((year + 4800 - ((14 - month) / 12)) / 100)              \
        + ((year + 4800 - ((14 - month) / 12)) / 400)              \
        - 32045                                                    \
      ) % 7];
}

int main(void) {
  printf("%d-%02d-%02d: %s\n", 2011, 5, 19, wd(2011, 5, 19));
  printf("%d-%02d-%02d: %s\n", 2038, 1, 19, wd(2038, 1, 19));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

通过从returnwd()函数中的行中删除拼接和空格,可以将其压缩为286个字符的单行:)

  • @JonathanLeffler:操作员想要“只有一行 C 代码” (2认同)