接着上一篇liblunar的日历bug问题,这里写了一个查询月份的工具,代码比较简陋
/* * author:pallover#gmail.com * website: http://pallove.is-programmer.com/ */ #include <lunar/lunar.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int str2int(const char *str) { int n = 0; while(*str >= '0' && *str <= '9') { n = n * 10 + (*str - '0'); str++; } return n; } int get_weekday(int year, int month, int day) { int m = month; if(m == 1) { m = 13; year -= 1; } else if(m == 2) { m = 14; year -= 1; } int c = year / 100; int y = year % 100; int d = day; return (((c >> 2) - (c << 1) + y + (y >> 2) + (13 * (m + 1) / 5) + d - 1) % 7 + 7) % 7; } int get_mdays(int year, int month) { switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if(!(year % 4) && year % 100 || !(year % 400)) return 29; else return 28; } } int main(int argc, char *argv[]) { struct tm *tm_ptr; time_t the_time; (void) time(&the_time); tm_ptr = localtime(&the_time); int nyear = 0, nmonth = 1, nday = 1; if(argc > 1) { nyear = str2int(argv[1]); if(nyear <= 1900) nyear = tm_ptr->tm_year + 1900; if(argc > 2) { nmonth = str2int(argv[2]); if(nmonth < 1) nmonth = 1; if(argc > 3) { nday = str2int(argv[3]); if(nday < 1) nday = 1; } } } else { nyear = tm_ptr->tm_year + 1900; nmonth = tm_ptr->tm_mon + 1; nday = tm_ptr->tm_mday; printf("%d, %d, %d\n", nyear, nmonth, nday); } lunar_init(&argc, &argv); LunarDate *lunar_date = lunar_date_new(); lunar_date_set_solar_date(lunar_date, nyear, nmonth, nday, 1, NULL); gchar *str = lunar_date_strftime(lunar_date, "%(NIAN)年%(YUE)月%(RI) 生肖:%(shengxiao) \n节日:%(jieri)"); printf("\n%*s%s%d年%d月%d日%s\n\n", 20, "", "\033[47m\033[31m", nyear, nmonth, nday, "\033[0m"); printf("农历:%s\n\n", str); char *weekday = "日一二三四五六"; char ch[4]; while(*weekday){ strncpy(ch, weekday, 3); ch[3] = 0; weekday += 3; printf("%*s%2s", 6, "", ch); } int i = 1, line, nlen, n, firstwday, endline = 0; int nmdays = get_mdays(nyear, nmonth); firstwday = get_weekday(nyear, nmonth, 1); printf("\n"); line = 7 - firstwday; while(nmdays > 0) { if(line % 7 && !endline) printf("%*s", firstwday << 3, ""); for(nlen = 0; nlen < line; nlen++, i++) { n = get_weekday(nyear, nmonth, i); printf("%*s%s%2d%s", 6, "", ((i == nday) ? "\033[36m\033[1m" : ""), i, ((i == nday) ? "\033[0m" : "")); } i -= line; if(n == 6 || endline) { printf("\n"); } if(line % 7 && !endline) printf("%*s", firstwday << 3, ""); for(nlen = 0; nlen < line; nlen++, i++) { lunar_date_set_solar_date(lunar_date, nyear, nmonth, i, 0, NULL); printf("%*s%s%4s%s", 4, "", ((i == nday) ? "\033[36m\033[1m" : ""), lunar_date_strftime(lunar_date, "%(RI)"), ((i == nday) ? "\033[0m" : "")); } if(n == 6 || endline) { printf("\n\n"); } nmdays -= line; line = (nmdays >= 7) ? 7 : nmdays % 7, endline = 1; } lunar_date_free(lunar_date); exit(0); }
可以传入0-3个自己想查询有效参数(年,月,日),如不输入,则默认为本地日期。
if (strstr(format, "%(jieri)") != NULL) { gchar bufs[128]; gchar *tmp; tmp = lunar_date_get_jieri(date, " "); if (*tmp) { g_utf8_strncpy(bufs, tmp, g_utf8_strlen(tmp, 128)); } /*if (strstr(tmp, " " ) != NULL) { char** buf = g_strsplit(tmp, " ", -1); if (g_utf8_validate(*buf, -1, NULL)) g_utf8_strncpy(bufs, *buf, 3); else { strncpy(bufs, *buf, 4); bufs[4]= '\0'; } g_strfreev(buf); } else { if (g_utf8_validate(tmp, -1, NULL)) g_utf8_strncpy(bufs, tmp, 3); else { strncpy(bufs, tmp, 4); bufs[4]= '\0'; } }*/ g_free(tmp); str = g_string_replace(str, "%(jieri)", bufs, -1); }
好吧,本意是要拆分开然后再组在一起,却写的莫名其妙的,应该用循环也没用,就改了下。这下可以显示全了。
测试的代码为:
#include <lunar/lunar.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { //g_type_init(); 这句我扔到lunar_init函数里面去了。 lunar_init(&argc, &argv); LunarDate *lunar_date = lunar_date_new(); lunar_date_set_solar_date(lunar_date, 2011, 10, 28, 1, NULL); gchar *str = lunar_date_strftime(lunar_date, "%(NIAN)年%(YUE)月%(RI)日%(SHI)时 生肖:%(shengxiao) 节日:%(jieri)"); printf("out str:%s", str); lunar_date_free(lunar_date); exit(0); }