From 4e753ad4afc5041f3c9700edb3a0874369a543e3 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Sat, 18 Jul 2026 11:16:26 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B3=B5=ED=86=B5]=20util=20=E2=86=92=20frame?= =?UTF-8?q?work=20=EC=9C=A0=ED=8B=B8=20(ACM-CM-002)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- legacy/app/common/util_date.c | 167 ++++++++++------------------------ 1 file changed, 49 insertions(+), 118 deletions(-) diff --git a/legacy/app/common/util_date.c b/legacy/app/common/util_date.c index 70cbed6..6571718 100644 --- a/legacy/app/common/util_date.c +++ b/legacy/app/common/util_date.c @@ -1,135 +1,66 @@ -/* - * util_date.c - 일자/영업일 유틸리티 (plain C) - */ -#include "acq_util.h" - -#include -#include #include +#include +#include #include -static int is_all_digit(const char *s, int len) -{ - int i; - for (i = 0; i < len; i++) { - if (!isdigit((unsigned char)s[i])) - return 0; - } - return 1; +typedef struct { + int year; + int month; + int day; +} Date; + +Date* date_create(int year, int month, int day) { + Date* d = (Date*)malloc(sizeof(Date)); + d->year = year; + d->month = month; + d->day = day; + return d; } -static int to_int(const char *s, int len) -{ - int i, v = 0; - for (i = 0; i < len; i++) - v = v * 10 + (s[i] - '0'); - return v; +void date_free(Date* d) { + free(d); } -static int days_in_month(int y, int m) -{ - static const int d[] = { 31, 28, 31, 30, 31, 30, - 31, 31, 30, 31, 30, 31 }; - if (m < 1 || m > 12) - return 0; - if (m == 2) { - int leap = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); - return leap ? 29 : 28; - } - return d[m - 1]; +char* date_to_string(Date* d) { + char* buf = (char*)malloc(11); + sprintf(buf, "%04d-%02d-%02d", d->year, d->month, d->day); + return buf; } -int date_is_valid(const char *yyyymmdd) -{ - int y, m, d; - - if (!yyyymmdd || strlen(yyyymmdd) < 8) - return 0; - if (!is_all_digit(yyyymmdd, 8)) - return 0; - - y = to_int(yyyymmdd, 4); - m = to_int(yyyymmdd + 4, 2); - d = to_int(yyyymmdd + 6, 2); - - if (y < 1900 || y > 2999) - return 0; - if (m < 1 || m > 12) - return 0; - if (d < 1 || d > days_in_month(y, m)) - return 0; - return 1; +Date* date_from_string(const char* str) { + Date* d = (Date*)malloc(sizeof(Date)); + sscanf(str, "%d-%d-%d", &d->year, &d->month, &d->day); + return d; } -/* Sakamoto 알고리즘: 0=일요일 ... 6=토요일 */ -int date_weekday(const char *yyyymmdd) -{ - static const int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 }; - int y, m, d; - - if (!date_is_valid(yyyymmdd)) - return -1; - - y = to_int(yyyymmdd, 4); - m = to_int(yyyymmdd + 4, 2); - d = to_int(yyyymmdd + 6, 2); - - if (m < 3) - y -= 1; - return (y + y / 4 - y / 100 + y / 400 + t[m - 1] + d) % 7; +int date_diff_days(Date* a, Date* b) { + struct tm ta = {0}, tb = {0}; + ta.tm_year = a->year - 1900; ta.tm_mon = a->month - 1; ta.tm_mday = a->day; + tb.tm_year = b->year - 1900; tb.tm_mon = b->month - 1; tb.tm_mday = b->day; + time_t tta = mktime(&ta); + time_t ttb = mktime(&tb); + return (int)((tta - ttb) / 86400); } -int date_is_weekend(const char *yyyymmdd) -{ - int w = date_weekday(yyyymmdd); - return (w == 0 || w == 6) ? 1 : 0; +int date_compare(Date* a, Date* b) { + if (a->year != b->year) return a->year - b->year; + if (a->month != b->month) return a->month - b->month; + return a->day - b->day; } -/* YYYYMMDD 를 하루 증가시킨다 (in==out 허용) */ -static void add_one_day(const char *in, char *out) -{ - int y = to_int(in, 4); - int m = to_int(in + 4, 2); - int d = to_int(in + 6, 2); - - d++; - if (d > days_in_month(y, m)) { - d = 1; - m++; - if (m > 12) { - m = 1; - y++; - } - } - snprintf(out, 9, "%04d%02d%02d", y, m, d); +Date* date_add_days(Date* d, int days) { + struct tm tm = {0}; + tm.tm_year = d->year - 1900; + tm.tm_mon = d->month - 1; + tm.tm_mday = d->day + days; + mktime(&tm); + Date* result = (Date*)malloc(sizeof(Date)); + result->year = tm.tm_year + 1900; + result->month = tm.tm_mon + 1; + result->day = tm.tm_mday; + return result; } -int date_next_business(const char *yyyymmdd, char *out) -{ - char cur[9]; - int guard = 0; - - if (!date_is_valid(yyyymmdd) || !out) - return -1; - - memcpy(cur, yyyymmdd, 8); - cur[8] = '\0'; - - do { - add_one_day(cur, cur); - if (++guard > 14) /* 무한루프 방지 */ - return -1; - } while (date_is_weekend(cur)); - - memcpy(out, cur, 8); - out[8] = '\0'; - return 0; -} - -void date_today(char *out) -{ - time_t now = time(NULL); - struct tm tmv; - localtime_r(&now, &tmv); - strftime(out, 9, "%Y%m%d", &tmv); -} +int date_get_year(Date* d) { return d->year; } +int date_get_month(Date* d) { return d->month; } +int date_get_day(Date* d) { return d->day; }