C,时间,日期,年份等

时间:2012-12-05 20:17:13

标签: c time cross-platform

我遇到了问题。 我需要得到像一年中的一天,一个月中的一天,一年中的一些月份等等。 我使用这段代码:

#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上都有效,我很乐意。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

Windows上的

localtime应该是线程安全的:http://msdn.microsoft.com/en-us/library/bf12f0hc%28VS.80%29.aspx

  

32位和64位版本的gmtime,mktime,mkgmtime和   localtimeall为每个线程使用单个tm结构进行转换。   每次调用其中一个例程都会破坏前一个例程的结果   调用