programing

C 프로그램에서 날짜 및 시간 값을 얻는 방법은 무엇입니까?

nasanasas 2021. 1. 5. 08:11
반응형

C 프로그램에서 날짜 및 시간 값을 얻는 방법은 무엇입니까?


다음과 같은 것이 있습니다.

char *current_day, *current_time;
system("date +%F");
system("date +%T");

그것은 표준 출력에 현재 날짜와 시간을 인쇄,하지만 난이 출력을 얻을 나에게 할당 할 current_daycurrent_time제가 나중에 그 값을 몇 가지 처리를 할 수 있도록하는 것이 변수.

current_day ==> current day
current_time ==> current time

내가 지금 생각할 수있는 유일한 해결책은 일부 파일에 출력을하고 파일을 읽은 다음에 날짜와 시간의 값을 할당하는 것입니다 current_daycurrent_time. 그러나 이것은 좋은 방법이 아니라고 생각합니다. 짧고 우아한 다른 방법이 있습니까?


시간을 얻으려면 time()사용 localtime():

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

void main()
{
  time_t t = time(NULL);
  struct tm tm = *localtime(&t);
  printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1,tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
}

time_t rawtime;   
time ( &rawtime );
struct tm *timeinfo = localtime ( &rawtime );

strftime시간을 문자열로 형식화하는 데 사용할 수도 있습니다 .


strftime (C89)

Martin이 언급했습니다 . 여기에 예가 있습니다.

main.c

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

int main(void) {
    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    char s[64];
    assert(strftime(s, sizeof(s), "%c", tm));
    printf("%s\n", s);
    return 0;
}

GitHub 업스트림 .

컴파일 및 실행 :

gcc -std=c89 -Wall -Wextra -pedantic -o main.out main.c
./main.out

샘플 출력 :

Thu Apr 14 22:39:03 2016

%c지정은 같은 형식을 생성합니다 ctime.

이 함수의 한 가지 장점은 작성된 바이트 수를 반환하여 생성 된 문자열이 너무 긴 경우 더 나은 오류 제어를 허용한다는 것입니다.

반환 가치

  Provided  that  the  result string, including the terminating null byte, does not exceed max bytes, strftime() returns the number of bytes (excluding the terminating null byte) placed in the array s.  If the length of the result string (including the terminating null byte) would exceed max bytes, then
   strftime() returns 0, and the contents of the array are undefined.

  Note that the return value 0 does not necessarily indicate an error.  For example, in many locales %p yields an empty string.  An empty format string will likewise yield an empty string.

asctimectime(C89)

asctime형식을 지정하는 편리한 방법입니다 struct tm.

main.c

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

int main(void) {
    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    printf("%s", asctime(tm));
    return 0;
}

샘플 출력 :

Wed Jun 10 16:10:32 2015

그리고 ctime()표준에서 다음과 같은 지름길이라고 말하는 것도 있습니다.

asctime(localtime())

Jonathan Leffler가 언급 했듯이이 형식에는 시간대 정보가 없다는 단점이 있습니다.

POSIX 7 은 이러한 기능을 "노후화"로 표시하여 향후 버전에서 제거 될 수 있습니다.

표준 개발자는 asctime ()이 버퍼 오버플로의 가능성으로 인해 ISO C 표준에 포함되어 있어도 asctime () 및 asctime_r () 함수를 폐기하기로 결정했습니다. ISO C 표준은 또한 이러한 문제를 피하는 데 사용할 수있는 strftime () 함수를 제공합니다.

이 질문의 C ++ 버전 : C ++에서 현재 시간과 날짜를 얻는 방법?

Ubuntu 16.04에서 테스트되었습니다.


위에 제공된 답변은 좋은 CRT 답변이지만 원하는 경우 Win32 솔루션을 사용할 수도 있습니다. 거의 동일하지만 Windows 용으로 프로그래밍하는 경우 IMO는 API를 사용하는 것이 좋습니다 (실제로 Windows에서 프로그래밍하는 경우는 모르지만 무엇이든간에)

char* arrDayNames[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; // Jeez I hope this works, I haven't done this in ages and it's hard without a compiler..
SYSTEMTIME st;
GetLocalTime(&st); // Alternatively use GetSystemTime for the UTC version of the time
printf("The current date and time are: %d/%d/%d %d:%d:%d:%d", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
printf("The day is: %s", arrDayNames[st.wDayOfWeek]);

어쨌든 이것은 Windows 솔루션입니다. 언젠가 도움이 되길 바랍니다!


Timespec에는 날짜가 내장되어 있습니다.

http://pubs.opengroup.org/onlinepubs/7908799/xsh/time.h.html

#include <time.h>
int get_day_of_year(){
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    return tm.tm_yday;
}`

대답을 확장하기오리 Osherov

WinAPI사용하여 날짜와 시간을 가져올 수 있습니다. 이 방법은 Windows에만 해당되지만 Windows만을 대상으로하거나 이미 WinAPI를 사용하고 있다면 확실히 가능성이 있습니다 1 :

을 사용하여 시간과 날짜를 모두 얻을 수 있습니다 . 또한 struct 를 채우기 위해 두 함수 ( 또는 ) 중 하나를 호출해야합니다 .SYSTEMTIME structGetLocalTime()GetSystemTime()

GetLocalTime()귀하의 시간대에 맞는 시간과 날짜 를 알려줍니다 .

GetSystemTime()UTC로 시간과 날짜 알려줍니다 .

다음과 같은 멤버를 가지고 :SYSTEMTIME struct

wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecondwMilliseconds

그런 다음 일반적인 방식으로 구조체액세스하면 됩니다.


실제 예제 코드 :

#include <windows.h> // use to define SYSTEMTIME , GetLocalTime() and GetSystemTime()
#include <stdio.h> // For printf() (could otherwise use WinAPI equivalent)

int main(void) { // Or any other WinAPI entry point (e.g. WinMain/wmain)

    SYSTEMTIME t; // Declare SYSTEMTIME struct

    GetLocalTime(&t); // Fill out the struct so that it can be used

    // Use GetSystemTime(&t) to get UTC time 

    printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute:%d, Second: %d, Millisecond: %d", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond, t.wMilliseconds); // Return year, month, day, hour, minute, second and millisecond in that order

    return 0;
}

(단순성과 명확성을 위해 코딩되었으며 더 나은 형식의 방법은 원래 답변을 참조하십시오 )

출력은 다음과 같습니다.

Year: 2018, Month: 11, Day: 24, Hour: 12, Minute:28, Second: 1, Millisecond: 572

유용한 참고 자료 :

모든 WinAPI 문서 (대부분 이미 위에 나열 됨) :

Zetcode의이 주제에 대한 매우 좋은 초보자 튜토리얼 :

Codeproject에서 datetime을 사용한 간단한 작업 :


1 : Ori Osherov의 답변 ( " Given that OP started with date +%F, they're almost certainly not using Windows. – melpomene Sep 9 at 22:17") 의 주석에서 언급했듯이 OP는 Windows를 사용 하지 않습니다 . 그러나이 질문에는 플랫폼 별 태그가 없기 때문에 (해당 특정 시스템에 대한 답변이 있어야한다고 언급하지 않습니다.) 인터넷 검색 "get time in c"두 답변이 여기에 속할 때 가장 많이 발생하는 결과 중 하나입니다.이 질문에 대한 답변을 검색하는 일부 사용자는 Windows에있을 수 있으므로 유용 할 것입니다.


파일 대신 파이프를 사용하고 C ++가 아닌 C를 사용하는 경우 다음과 같이 popen을 사용할 수 있습니다.

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

FILE *fp= popen("date +F","r");

fgets와 함께 * fp를 일반 파일 포인터로 사용하십시오.

C ++ 문자열을 사용하고 자식을 포크하고 명령을 호출 한 다음 부모에게 파이프하십시오.

   #include <stdlib.h>
   #include <iostream>
   #include <string>
   using namespace std;

   string currentday;
   int dependPipe[2];

   pipe(dependPipe);// make the pipe

   if(fork()){//parent
           dup2(dependPipe[0],0);//convert parent's std input to pipe's output
           close(dependPipe[1]);
           getline(cin,currentday);

    } else {//child
        dup2(dependPipe[1],1);//convert child's std output to pipe's input
        close(dependPipe[0]);

        system("date +%F");
    }

// 날짜 + T에 대해 비슷한 1을 만드십시오. 그러나 제 시간에 물건을 고수하는 것이 좋습니다 .h GL


I'm getting the following error when compiling Adam Rosenfield's code on Windows. It turns out few things are missing from the code.

Error (Before)

C:\C\Codes>gcc time.c -o time
time.c:3:12: error: initializer element is not constant
 time_t t = time(NULL);
            ^
time.c:4:16: error: initializer element is not constant
 struct tm tm = *localtime(&t);
                ^
time.c:6:8: error: expected declaration specifiers or '...' before string constant
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
        ^
time.c:6:36: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                    ^
time.c:6:55: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                       ^
time.c:6:70: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                                      ^
time.c:6:82: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                                                  ^
time.c:6:94: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                                                              ^
time.c:6:105: error: expected declaration specifiers or '...' before 'tm'
 printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
                                                                                                         ^
C:\C\Codes>

Solution

C:\C\Codes>more time.c
#include <stdio.h>
#include <time.h>

int main()
{
        time_t t = time(NULL);
        struct tm tm = *localtime(&t);

        printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
}

C:\C\Codes>

Compiling

C:\C\Codes>gcc time.c -o time

C:\C\Codes>    

Final Output

C:\C\Codes>time
now: 2018-3-11 15:46:36

C:\C\Codes>

I hope this will helps others too


#include<stdio.h>
using namespace std;

int main()
{
printf("%s",__DATE__);
printf("%s",__TIME__);

return 0;
}

ReferenceURL : https://stackoverflow.com/questions/1442116/how-to-get-the-date-and-time-values-in-a-c-program

반응형