3

問題があります。年の日、月の日、月などを取得する必要があります。次のコードを使用します。

#include <stdio.h>
#include <time.h>
int main(void)
{    
    time_t liczba_sekund;
    struct tm strukt;
    time(&liczba_sekund);
    localtime_r(&liczba_sekund, &strukt); 
    printf("today is %d day of year\nmonth is %d, month's day %d\n", strukt.tm_yday+1, strukt.tm_mon+1, strukt.tm_mday); 
    return 0;
}

最初に: gcc -std=c99 -pedantic -Wall がこの警告を返すのはなぜですか:

私の入力: gcc test_data.c -o test_data.out -std=c99 -pedantic -Wall

出力:

test_data.c: 関数 'main' 内:

test_data.c:11:3: 警告: 関数 'localtime_r' の暗黙の宣言 [-Wimplicit-function-declaration]

2 つ目: Windows で動作させるにはどうすればよいですか? Dev-C を使用してコンパイルしようとすると、次のようになりました: http://imgur.com/U7dyE

@@EDIT -------------------- あなたの現地時間の提案の例を見つけました:

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

int main ()
{
    time_t time_raw_format;
    struct tm * ptr_time;

    time ( &time_raw_format );
    ptr_time = localtime ( &time_raw_format );
    printf ("Current local time and date: %s", asctime(ptr_time));
    return 0;
}

これを次のような日付形式に変更するにはどうすればよいですか: 5.12.2012 または 5-12-2012? 年間通算日を取得する方法は?

このソリューションが Windows と Linux の両方で機能することを願っています。

4

2 に答える 2

8

localtime_rC 標準の一部ではありません。多分あなたは探していましたlocaltimeか?

localtime_r多くのLinuxシステムで実際に利用可能です:

スレッドセーフ バージョンの asctime_r()、ctime_r()、gmtime_r()、および localtime_r() は SUSv2 で指定されており、libc 5.2.5 以降で使用できます。

ただし、これは標準の一部ではないため、Windows では使用できません。

これを次のような日付形式に変更するにはどうすればよいですか: 5.12.2012 または 5-12-2012? 年間通算日を取得する方法は?

strftime代わりに使用する必要がありますasctime

int main ()
{
    time_t time_raw_format;
    struct tm * ptr_time;
    char buffer[50];

    time ( &time_raw_format );
    ptr_time = localtime ( &time_raw_format );
    if(strftime(buffer,50,"%d.%m.%Y",ptr_time) == 0){
        perror("Couldn't prepare formatted string");
    } else {
        printf ("Current local time and date: %s", buffer);
    }
    return 0;
}
于 2012-12-05T20:20:55.060 に答える
0

Windows の localtime は、http: //msdn.microsoft.com/en-us/library/bf12f0hc%28VS.80%29.aspxに従ってスレッドセーフである必要があります。

gmtime、mktime、mkgmtime、および localtimeall の 32 ビット バージョンと 64 ビット バージョンの両方が、変換のためにスレッドごとに 1 つの tm 構造体を使用します。これらのルーチンのいずれかを呼び出すたびに、前の呼び出しの結果が破棄されます。

于 2012-12-05T20:29:36.947 に答える