3724:unix纪元——标准库时间函数的应用

 

I’m a programmer,damnit. I don’t write code. 

——The anti-programming programmer

 


在一些简单的题目中经常有一些进行时间转化的题目,如3724:unix纪元,当然可以自己写代码进行转换,也可以时候标准C的相关的一些库函数。

time_t 和 time

typedef ... time_t;
time_t time(time_t *tptr);

标准C的time函数返回一个用time_t类型(time_t可以是任何算术类型)的值封装的当前日历时间。如果形参*tptr不是null指针,返回值将存储在*tptr中;如果遇到错误则返回-1(转换为time_t类型)。

一般情况下,time所返回的值被传递给asctime或ctime函数,转换为一种可读的格式;或者传递给localtime或gtime函数,转换为一种更容易处理的格式。

tm 、gmtime 、localtime 和 mktime

struct tm {
	int tm_sec;     /* seconds after the minute - [0,59] */
	int tm_min;     /* minutes after the hour - [0,59] */
	int tm_hour;    /* hours since midnight - [0,23] */
	int tm_mday;    /* day of the month - [1,31] */
	int tm_mon;     /* months since January - [0,11] */
	int tm_year;    /* years since 1900 */
	int tm_wday;    /* days since Sunday - [0,6] */
	int tm_yday;    /* days since January 1 - [0,365] */
	int tm_isdst;   /* daylight savings time flag */
};
struct tm *gmtime(const time_t *t);
struct tm *localtime(const time_t *t);
time_t mktime(struct tm *tmptr);

gmtime和localtime函数把time函数所返回的算术日历时间转换为一种struct tm类型的“分解”形式;其中gmtime转换为格林威治时间(GMT),而loacltime转换为本地时间,并考虑了时区、夏令时等因素。如果遇到错误两者都返回一个null指针。

mktime函数在tmptr参数所指定的分解形式的本地时间的基础上构建一个time_t类型的值。tmptr->wday和tmptr->yday的值被mktime所忽略。如果调用成功,mktime返回一个新的时间值,并调整*tmptr的内容,设置它的tmptr->wday和tmptr->yday成员;如果指定的日历时间无法用time_t类型的值表示则返回-1(转化为time_t)。

asctime 和 ctime


char *asctime(const struct tm *ts)
char *ctime(const time_t *timptr);
asctime 和 ctime函数都返回一个指向字符串的指针,表示一个可打印的日期和时间,形式如下:Fri Jan 13 16:25:27 2012\n

那么,实现3724:unix纪元就比较容易了,代码如下:

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

int main()
{
	time_t s;
	while(scanf("%lld",&s)!=EOF)
	{
		tm *t=gmtime(&s);
		printf("%4d-%02d-%02d %02d:%02d:%02d\n",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
	}
}

  

posted @ 2012-01-13 17:01  狼の禅  阅读(1466)  评论(1编辑  收藏  举报
我要啦免费统计