๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
6. CS ๊ธฐ์ดˆ ๐Ÿ“š/Linux & Unix ๐Ÿง

[Linux/Unix][7-2] date ์ถœ๋ ฅ

by lxvxxu 2025. 10. 21.

ํ•„์š”ํ•œ err ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ฒƒ !

 

 

 

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

int main(void)
{
    // ํ•œ๊ตญ์–ด ์š”์ผ ๋ฐ ์ง€์—ญ ํ˜•์‹ ์ถœ๋ ฅ์„ ์œ„ํ•ด ๋กœ์บ˜ ์„ค์ •
    setlocale(LC_TIME, "ko_KR.UTF-8");

    time_t t;              // ํ˜„์žฌ ์‹œ๊ฐ„์„ ์ €์žฅํ•  ๋ณ€์ˆ˜
    struct tm *tm_info;    // ์ง€์—ญ ์‹œ๊ฐ„ ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ
    char buf[100];         // ํฌ๋งท ๋ฌธ์ž์—ด ์ €์žฅ ๋ฒ„ํผ

    // 1. ํ˜„์žฌ ์‹œ๊ฐ(์ดˆ ๋‹จ์œ„, UTC ๊ธฐ์ค€) ๊ฐ€์ ธ์˜ค๊ธฐ
    time(&t);

    // 2. ์ง€์—ญ ์‹œ๊ฐ„๋Œ€(KST ๋“ฑ)์— ๋งž๊ฒŒ ๋ณ€ํ™˜
    tm_info = localtime(&t);

    // 3. ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฌธ์ž์—ด ์ƒ์„ฑ
    //    %Y: ์—ฐ๋„ 4์ž๋ฆฌ, %m: ์›”, %d: ์ผ
    //    %a: ์š”์ผ(ํ™”), %p: ์˜ค์ „/์˜คํ›„, %H:%M:%S: ์‹œ:๋ถ„:์ดˆ
    //    %Z: ์‹œ๊ฐ„๋Œ€(KST)
    strftime(buf, sizeof(buf), "%Y. %m. %d. (%a) %H:%M:%S %Z", tm_info);

    // 4. ์ถœ๋ ฅ
    printf("%s\n", buf);

    return 0;
}

 

์‚ฌ์ง„์ฒ˜๋Ÿผ date ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ “2025. 10. 14. (ํ™”) 10:40:28 KST” ์ฒ˜๋Ÿผ ์ถœ๋ ฅ๋˜๋„๋ก ํ•˜๋Š” C ํ”„๋กœ๊ทธ๋žจ์€
์‹œ์Šคํ…œ ์‹œ๊ฐ„(time()), ์ง€์—ญ ์‹œ๊ฐ„(localtime()), ํฌ๋งท(strftime()) ์„ ์กฐํ•ฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿง  ์ฝ”๋“œ ์„ค๋ช…

๋‹จ๊ณ„๊ธฐ๋Šฅ์„ค๋ช…
setlocale(LC_TIME, "ko_KR.UTF-8"); ๋กœ์บ˜(locale) ์„ค์ • ์š”์ผ์ด๋‚˜ ์›” ์ด๋ฆ„์ด ํ•œ๊ธ€๋กœ ๋‚˜์˜ค๊ฒŒ ํ•จ. (์‹œ์Šคํ…œ์— ko_KR.UTF-8์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•จ)
time(&t); ํ˜„์žฌ ์‹œ๊ฐ ํš๋“ UTC ๊ธฐ์ค€ ์ดˆ ๋‹จ์œ„ ์‹œ๊ฐ์„ time_t์— ์ €์žฅ
localtime(&t); ์ง€์—ญ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ UTC → KST(ํ•œ๊ตญ ํ‘œ์ค€์‹œ)
strftime() ํฌ๋งท ๋ฌธ์ž์—ด ์ƒ์„ฑ ์›ํ•˜๋Š” ํ˜•์‹(%Y.%m.%d.(%a) %H:%M:%S %Z)์œผ๋กœ ๋ณ€ํ™˜
printf("%s\n", buf); ์ตœ์ข… ์ถœ๋ ฅ ๋ณ€ํ™˜๋œ ๋‚ ์งœ ๋ฌธ์ž์—ด์„ ํ™”๋ฉด์— ์ถœ๋ ฅ

๐Ÿ’ก ์ถœ๋ ฅ ์˜ˆ์‹œ

$ gcc -o mydate date.c
$ ./mydate
2025. 10. 14. (ํ™”) 10:40:28 KST

 

 

โš™๏ธ ์ฃผ์š” ํฌ๋งท ์ง€์ •์ž ์ •๋ฆฌ (strftime())

์ง€์ •์ž์˜๋ฏธ์˜ˆ์‹œ
%Y ์—ฐ๋„ (4์ž๋ฆฌ) 2025
%m ์›” (01–12) 10
%d ์ผ (01–31) 14
%a ์š”์ผ ์•ฝ์–ด (locale ๊ธฐ๋ฐ˜) ํ™”
%H ์‹œ (00–23) 10
%M ๋ถ„ (00–59) 40
%S ์ดˆ (00–59) 28
%Z ์‹œ๊ฐ„๋Œ€ KST

 


์—๋Ÿฌ ์ฒ˜๋ฆฌ

 

์ข‹์•„์š” ๐Ÿ‘ ์™„๋ฒฝํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, ์‹œ๊ฐ„ ํ•จ์ˆ˜๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋„ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.
(์‹คํŒจ ํ™•๋ฅ ์€ ๋‚ฎ์ง€๋งŒ, time() / localtime() / strftime()์ด NULL์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”.)

 

โœ… ๊ฐœ์„ ๋œ ์ฝ”๋“œ — ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํฌํ•จ ๋ฒ„์ „ (date_safe.c)

 
#include <stdio.h>
#include <time.h>
#include <locale.h>
#include <stdlib.h>

int main(void)
{
    // 1๏ธโƒฃ ํ•œ๊ตญ์–ด ๋กœ์บ˜ ์„ค์ • (์š”์ผ์ด "(ํ™”)"์ฒ˜๋Ÿผ ์ถœ๋ ฅ๋˜๋„๋ก)
    if (setlocale(LC_TIME, "ko_KR.UTF-8") == NULL) {
        fprintf(stderr, "โš ๏ธ  Warning: Cannot set locale to ko_KR.UTF-8. Default locale will be used.\n");
    }

    // 2๏ธโƒฃ ํ˜„์žฌ ์‹œ๊ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
    time_t t = time(NULL);
    if (t == ((time_t)-1)) {
        perror("โŒ time() failed");
        return EXIT_FAILURE;
    }

    // 3๏ธโƒฃ ์ง€์—ญ ์‹œ๊ฐ„ ๊ตฌ์กฐ์ฒด๋กœ ๋ณ€ํ™˜
    struct tm *tm_info = localtime(&t);
    if (tm_info == NULL) {
        perror("โŒ localtime() failed");
        return EXIT_FAILURE;
    }

    // 4๏ธโƒฃ ํฌ๋งทํŒ…๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
    char buf[100];
    if (strftime(buf, sizeof(buf), "%Y. %m. %d. (%a) %H:%M:%S %Z", tm_info) == 0) {
        fprintf(stderr, "โŒ strftime() failed: buffer too small or formatting error.\n");
        return EXIT_FAILURE;
    }

    // 5๏ธโƒฃ ์ตœ์ข… ์ถœ๋ ฅ
    printf("%s\n", buf);

    return EXIT_SUCCESS;
}

๐Ÿง  ์ฝ”๋“œ ์„ค๋ช… (์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ค‘์‹ฌ)

๋‹จ๊ณ„ํ•จ์ˆ˜์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋‚ด์šฉ
1 setlocale() ํ•ด๋‹น ๋กœ์บ˜์ด ์„ค์น˜๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ NULL ๋ฐ˜ํ™˜ → ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ๊ณ„์† ์‹คํ–‰
2 time() ํ˜„์žฌ ์‹œ๊ฐ์„ ๊ตฌํ•˜์ง€ ๋ชปํ•˜๋ฉด -1 ๋ฐ˜ํ™˜ → perror()๋กœ ์˜ค๋ฅ˜ ์„ค๋ช… ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
3 localtime() ๋ณ€ํ™˜ ์‹คํŒจ ์‹œ NULL ๋ฐ˜ํ™˜ → perror()๋กœ ์˜ค๋ฅ˜ ์„ค๋ช… ํ›„ ์ข…๋ฃŒ
4 strftime() ๋ฒ„ํผ ํฌ๊ธฐ๊ฐ€ ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ํฌ๋งท ์‹คํŒจ ์‹œ 0 ๋ฐ˜ํ™˜ → ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
5 printf() ์ •์ƒ ์ถœ๋ ฅ (์ด ๋‹จ๊ณ„์—์„  ์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํŒจํ•˜์ง€ ์•Š์Œ)

๐Ÿ’ป ์‹คํ–‰ ์˜ˆ์‹œ

$ gcc -Wall -Wextra -O2 -o mydate date_safe.c
$ ./mydate
2025. 10. 14. (ํ™”) 10:40:28 KST

 

 

 


์‘์šฉ

 

 

๋‹ค๋ฅธ ์ง€์—ญ ์‹œ๊ฐ„๋Œ€์™€ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ๋ ค์คญ

ChatGPT์˜ ๋ง:

์•„์ฃผ ์ข‹์•„์š” ๐Ÿ‘
์ง€๊ธˆ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์€ ํ•œ๊ตญ ํ‘œ์ค€์‹œ(KST) ์™€
"%Y. %m. %d. (%a) %H:%M:%S %Z" ํ˜•์‹์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ,
์›ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์ง€์—ญ ์‹œ๊ฐ„๋Œ€๋‚˜ ๋‹ค๋ฅธ ํ˜•์‹(format) ์œผ๋กœ ์–ผ๋งˆ๋“ ์ง€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”.


๐Ÿ•’ 1๏ธโƒฃ ๋‹ค๋ฅธ ์ง€์—ญ ์‹œ๊ฐ„๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ธฐ

C ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‹œ๊ฐ„๋Œ€๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ TZ ๋กœ ๋ฐ”๊ฟ”์š”.

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

int main(void)
{
    time_t t = time(NULL);
    struct tm *tm_info;

    // ๐Ÿ”น ์˜ˆ: ๋ฏธ๊ตญ ๋‰ด์š•(EST) ์‹œ๊ฐ„๋Œ€๋กœ ์„ค์ •
    setenv("TZ", "America/New_York", 1);
    tzset(); // ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœํ•ด์•ผ TZ ์ ์šฉ๋จ

    tm_info = localtime(&t);
    char buf[100];
    strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm_info);

    printf("๐Ÿ—ฝ New York Time: %s\n", buf);

    // ๐Ÿ”น ๋Ÿฐ๋˜(UTC)
    setenv("TZ", "Europe/London", 1);
    tzset();
    tm_info = localtime(&t);
    strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm_info);
    printf("๐Ÿ‡ฌ๐Ÿ‡ง London Time : %s\n", buf);

    // ๐Ÿ”น ๋„์ฟ„(Japan)
    setenv("TZ", "Asia/Tokyo", 1);
    tzset();
    tm_info = localtime(&t);
    strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm_info);
    printf("๐Ÿ‡ฏ๐Ÿ‡ต Tokyo Time  : %s\n", buf);

    return 0;
}

๐Ÿ’ฌ ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

(์‹ค์ œ ์‹œ์ ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง)

๐Ÿ—ฝ New York Time: 2025-10-14 09:40:28 EDT
๐Ÿ‡ฌ๐Ÿ‡ง London Time : 2025-10-14 14:40:28 BST
๐Ÿ‡ฏ๐Ÿ‡ต Tokyo Time  : 2025-10-14 22:40:28 JST

๐Ÿ“Œ ํ•ต์‹ฌ ํฌ์ธํŠธ

  • setenv("TZ", "์ง€์—ญ/๋„์‹œ", 1); ๋กœ ์‹œ๊ฐ„๋Œ€๋ฅผ ์„ค์ •
  • tzset(); ํ˜ธ์ถœ๋กœ ์ฆ‰์‹œ ๋ฐ˜์˜
  • "Asia/Seoul", "Europe/Paris", "America/Los_Angeles" ๋“ฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • /usr/share/zoneinfo ๊ฒฝ๋กœ์— ์‹ค์ œ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„๋Œ€ ๋ชฉ๋ก์ด ์žˆ์–ด์š”.

๐Ÿงญ 2๏ธโƒฃ ๋‹ค๋ฅธ ์ถœ๋ ฅ ํ˜•์‹(format) ์ง€์ •ํ•˜๊ธฐ

strftime()์€ ํฌ๋งท ๋ฌธ์ž์—ด์„ ์ž์œ ๋กญ๊ฒŒ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
์•„๋ž˜๋Š” ์ž์ฃผ ์“ฐ๋Š” ์˜ˆ์‹œ๋“ค์ด์—์š” ๐Ÿ‘‡

ํ˜•์‹ ๋ฌธ์ž์—ด์ถœ๋ ฅ ์˜ˆ์‹œ์„ค๋ช…
"%Y-%m-%d %H:%M:%S" 2025-10-14 10:40:28 ์ผ๋ฐ˜์ ์ธ ๋‚ ์งœ/์‹œ๊ฐ„ ํ˜•์‹
"%A, %B %d, %Y" Tuesday, October 14, 2025 ์˜์–ด ๊ธด ํ˜•์‹
"%m/%d/%Y %I:%M:%S %p" 10/14/2025 10:40:28 AM ๋ฏธ๊ตญ์‹ 12์‹œ๊ฐ„์ œ
"%d-%b-%Y (%a)" 14-Oct-2025 (Tue) ์งง์€ ์š”์ผ/์›” ์ด๋ฆ„
"%H์‹œ %M๋ถ„ %S์ดˆ" 10์‹œ 40๋ถ„ 28์ดˆ ํ•œ๊ตญ์‹ ํ‘œ๊ธฐ
"%c" Tue Oct 14 10:40:28 2025 ์‹œ์Šคํ…œ ๊ธฐ๋ณธ ํ˜•์‹
"%x %X" 2025-10-14 10:40:28 ์ง€์—ญ๋ณ„ ๋‚ ์งœ์™€ ์‹œ๊ฐ„
"%Y๋…„ %m์›” %d์ผ (%a) %p %I์‹œ %M๋ถ„ %S์ดˆ" 2025๋…„ 10์›” 14์ผ (ํ™”) ์˜ค์ „ 10์‹œ 40๋ถ„ 28์ดˆ ์™„์ „ ํ•œ๊ตญ์‹ ํฌ๋งท

๐Ÿงช 3๏ธโƒฃ ์˜ˆ์‹œ — ๋‹ค์–‘ํ•œ ํฌ๋งท ํ•œ ๋ฒˆ์— ์ถœ๋ ฅํ•˜๊ธฐ

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

int main(void)
{
    setlocale(LC_TIME, "ko_KR.UTF-8");
    time_t t = time(NULL);
    struct tm *tm_info = localtime(&t);
    char buf[100];

    strftime(buf, sizeof(buf), "%Y๋…„ %m์›” %d์ผ (%a) %p %I์‹œ %M๋ถ„ %S์ดˆ", tm_info);
    printf("ํ•œ๊ตญ์‹: %s\n", buf);

    strftime(buf, sizeof(buf), "%A, %B %d, %Y %I:%M:%S %p", tm_info);
    printf("์˜๋ฌธ์‹: %s\n", buf);

    strftime(buf, sizeof(buf), "%c", tm_info);
    printf("๊ธฐ๋ณธํ˜•: %s\n", buf);

    return 0;
}

 

๐Ÿงฉ ์ •๋ฆฌ

๊ธฐ๋Šฅ๋ฐฉ๋ฒ•์˜ˆ์‹œ
๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€ ์ถœ๋ ฅ setenv("TZ", "Asia/Tokyo", 1); tzset(); ๋„์ฟ„ ์‹œ๊ฐ„ ์ถœ๋ ฅ
์‹œ๊ฐ„ ํ˜•์‹ ๋ฐ”๊พธ๊ธฐ strftime(buf, sizeof(buf), "ํ˜•์‹", tm_info); "%Y-%m-%d %H:%M:%S" ๋“ฑ
ํ•œ๊ตญ์–ด ์š”์ผ ์ถœ๋ ฅ setlocale(LC_TIME, "ko_KR.UTF-8"); (ํ™”) ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ
UTC ์ถœ๋ ฅ gmtime() ์‚ฌ์šฉ ์„ธ๊ณ„ ํ‘œ์ค€์‹œ๋กœ ํ‘œ์‹œ