浅谈时间
———- android培训、java培训、期待与您交流! ———-
引入
一个简单的时间打印
#include <stdio.h>
#include <time.h>
int main(int argc, const char * argv[]) {
// 声明变量并初始化
const char *weekday[] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
long current_time = 0;
struct tm *s_time = NULL;
// 获取当前时间
time(¤t_time);
// 把当前时间转化为我们通常所见的形式并付给结构体 tm
s_time = localtime(¤t_time);
printf("%d/%d/%d\n", (1900+s_time ->tm_year),
(1+s_time -> tm_mon),
s_time -> tm_mday);
printf("%s %d:%d:%d\n", weekday[s_time ->tm_wday],
s_time ->tm_hour,
s_time ->tm_min,
s_time ->tm_sec);
return 0;
}
输出打印结果:
程序讲解
- 我的程序是在最新的xcode下运行的
long current_time = 0;
这句声明本身是应该用time_t 类型的但是time_t的本质就是long型的我这里只是想说明这点
下面这句中的tm结构体定义在time.h文件中
struct tm *s_time = NULL;
如下所示:
struct tm {
int tm_sec; /* seconds after the minute [0-60] */
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 */
long tm_gmtoff; /* offset from CUT in seconds */
char *tm_zone; /* timezone abbreviation */
};
从上面代码中给出的注释我们可以了解到结构体的成员变量tm_year是从1900年开始计时的所以我在本程序打印时间时+了1900
而成员变量tm_mon是以0-11来表示12个月份的所以我在打印的时候+了1
time()函数
该函数是定义在time.h
文件中的(#include<time.h>
)
函数定义为:time_t time(time_t *tloc);
说明
该函数返回从公园1970年1月1日的0:0:0 开始到当前时间的秒数这是个UTC时间
PS:UTC是协调世界时(Universal Time Coordinated)英文缩写,是由国际无线电咨询委员会规定和推荐,并由国际时间局(BIH)负责保持的以秒为基础的时间标度。UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示.北京时间比UTC时间早8小时,以1999年1月1日0000UTC为例,UTC时间是零点,北京时间为1999年1月1日早上8点整。
整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。
如果time_t指针tloc指向地址内容是非NULL的那么该内存也将存储该秒数值
localtime()函数
该函数也是定义在time.h
文件中的
struct tm* localtime(const time_t* clock);
说明:该函数将clock指向内存中存储的时间秒数值转换为我们平时使用的时间并存储到结构体tm中,并返回该结构体的指针
其他相关常用时间函数
mktime()函数
该函数定义在time.h
文件中
time_t mktime(struct tm *timeptr);
说明:该函数是将我们平时所用的时间在转换为time函数得到的纯秒数值并返回
#include <stdio.h>
#include <time.h>
int main(int argc, const char * argv[]) {
const char *weekday[] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
long current_time = 0;
struct tm *s_time = NULL;
// 获取当前时间
printf("time_function return value is %ld\n", time(¤t_time));
// 把当前时间转化为我们通常所见的形式并付给结构体 tm
s_time = localtime(¤t_time);
printf("%d/%d/%d\n", (1900+s_time ->tm_year),
(1+s_time -> tm_mon),
s_time -> tm_mday);
printf("%s %d:%d:%d\n", weekday[s_time ->tm_wday],
s_time ->tm_hour,
s_time ->tm_min,
s_time ->tm_sec);
printf("mktime_function return vlaue is %ld\n", mktime(s_time));
return 0;
}
gmtime()函数
该函数定义在time.h
文件中
struct tm *gmtime(const time_t *clock);
说明:该函数和localtime()函数类似返回的是我们平时所用的时间
但是该函数返回tm结构中的时间是UTC时间,也就是说该函数返回的时间没有经过时区的转换
ctime()函数
该函数定义在time.h
文件中
char *ctime(const time_t *clock);
说明:该函数讲当前秒数的时间值转换为特定格式的现实时间并以
字符串的形式返回。
#include <stdio.h>
#include <time.h>
int main(int argc, const char * argv[]) {
time_t current_time = 0;
time(¤t_time);
printf("currnet time is -> %s\n", ctime(¤t_time));
return 0;
}
打印结果:
⚠需要注意的是:该函数若再调用相关的时间日期函数,函数返回值的字符串可能会被破坏。