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]

第二件事:如何使它在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_r不是 C 标准的一部分。也许你在找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 上的本地时间应该是线程安全的:http: //msdn.microsoft.com/en-us/library/bf12f0hc%28VS.80%29.aspx

32 位和 64 位版本的 gmtime、mktime、mkgmtime 和 localtime 都对每个线程使用单个 tm 结构进行转换。对这些例程之一的每次调用都会破坏前一次调用的结果。

于 2012-12-05T20:29:36.947 回答