小智 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)
或者你可以编码这些规则来在一个很长的单行中做一些算术:
编辑:请注意,此解决方案仅适用于UNIX纪元(1970-01-01T00:00:00Z)之后的日期.
这是基于维基百科关于朱利安日的文章的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)
通过从return
wd()函数中的行中删除拼接和空格,可以将其压缩为286个字符的单行:)