十八 C 中的 mktime stime

功能

将时间转换为自197011日以来失去时间的秒数,发生错误时返回-1.

相关函数

timeasctimegmtimelocaltime

表头文件

#include <time.h>

定义函数

time_t mktime(struct tm * timeptr);

函数说明

mktime()用来将参数timeptr所指的tm结构数据转换成从公元19701100秒算起至今的UTC时间所经过的秒数。

返回值

返回经过的秒数。

范例

/* time()取得时间(秒数),利用localtime()

转换成struct tm 再利用mktime()将struct tm转换成原来的秒数*/

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <stdio.h>

#include <time.h>

intmain(void)

{

    time_ttimep;

    structtm*p;

    time(&timep);

    printf("time() : %d \n",timep);

    p=localtime(&timep);

    timep =mktime(p);

    printf("time()->localtime()->mktime():%d\n",timep);

    return0;

}

 

我的电脑上,此时运行所得的输出为:

1

2

time() : 1270271767

time()->localtime()->mktime()://1270271767

 

当然,你来运行这个例子的时候,结果肯定不一样了,呵呵,除非你电脑时间没调好,呵呵。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`mktime` 函数是 C 标准库的函数,其实现比较复杂,需要考虑多个因素,比如闰年、夏令时、时区等。以下是一个简化版的 `mktime` 函数实现,仅考虑了不跨越夏令时和非闰年的情况: ```c #include <time.h> #define SECS_PER_DAY 86400 #define SECS_PER_HOUR 3600 #define SECS_PER_MINUTE 60 time_t my_mktime(struct tm *timeptr) { int year, month, day, hour, minute, second; int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 获取年、月、日、时、分、秒 year = timeptr->tm_year + 1900; month = timeptr->tm_mon + 1; day = timeptr->tm_mday; hour = timeptr->tm_hour; minute = timeptr->tm_min; second = timeptr->tm_sec; // 计算天数 int days = (year - 1970) * 365; for (int i = 1970; i < year; i++) { if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) { days++; } } for (int i = 1; i < month; i++) { days += days_in_month[i - 1]; } if (month > 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) { days++; } days += day - 1; // 计算秒数 time_t seconds = days * SECS_PER_DAY + hour * SECS_PER_HOUR + minute * SECS_PER_MINUTE + second; return seconds; } ``` 以上代码,我们使用了一个 `days_in_month` 数组来保存每个月的天数,然后根据年、月、日计算出总共的天数,再将其转换为秒数即可。需要注意的是,由于 `struct tm` 结构体的年份是从 1900 年开始计算的,因此需要将其加上 1900。此外,由于计算过程没有考虑夏令时、时区等因素,因此在实际使用时可能会存在一定的误差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值