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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值