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

来源:互联网 发布:lnmp yum安装教程 编辑:程序博客网 时间:2024/04/29 01:12

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);}}

原创粉丝点击