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