说明
每个月的开始时间为yyyy-mm-01 00:00:00,结束时间为yyyy-mm-dd 23:59:59,其中结束时间的dd值,根据月份可能为:
- 31(1、3、5、7、8、10、12月)
- 30(4、6、9、11月)
- 28(平年2月)
- 29(闰年2月)
字符串转时间戳
根据函数time_t mktime(struct tm *timeptr)
可以获取到字符串yyyy-mm-ddThh:mm:ss对应时间戳
int cTime_to_uTime(char *time_buf, time_t* time_val)
{
time_t time = 0;
struct tm stime;
int n;
if(time_buf == NULL) {
return -1;
}
n = sscanf(time_buf,"%04d-%02d-%02dT%02d:%02d:%02d",
&stime.tm_year,
&stime.tm_mon,
&stime.tm_mday,
&stime.tm_hour,
&stime.tm_min,
&stime.tm_sec);
if (n != 6) {
return -1;
}
stime.tm_year -= 1900;
stime.tm_mon -= 1;
stime.tm_isdst = 0;
time = mktime(&stime);
*time_val = time;
printf("time[%s] timestamp[%lu]\n", time_buf, time);
return 0;
}
获取月份开始和结束时间戳
方法一
由于mktime会自动调整时间,所以可以设置结束时间为yyyy-(mm+1)-00 23:59:59,会自动跳转到上一个月的最后一天
void get_month_start_end_utime(int year, int month, time_t* start_time, time_t* end_time)
{
char statime_buf[32] ={
0};
char endtime_buf[32] = {
0};
sprintf(statime_buf, "%04d-%02d-01T00:00:00", year, month);
sprintf(endtime_buf, "%04d-%02d-00T23:59:59", year, month+1);
cTime_to_uTime(statime_buf, start_time);
cTime_to_uTime(endtime_buf, end_time);
}
方法二
先获取每个月的开始时间,这个是固定的值,在加上这个月的时间长度
int get_month_days(int year, int month)
{
int days = 0;
if (month == 2) {
if(((year%100 !=0 && year%4 == 0) || year%400 == 0)) {
days=29;
} else {
days=28;
}
} else {
switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:days=31;break;
case 4:
case 6:
case 9:
case 11: days=30;break;
}
}
return days;
}
void get_month_start_end_utime_safe(int year, int month, time_t* start_time, time_t* end_time)
{
char statime_buf[32] ={
0};
sprintf(statime_buf, "%04d-%02d-01T00:00:00", year, month);
cTime_to_uTime(statime_buf, start_time);
*end_time = *start_time + 3600*24*get_month_days(year, month) - 1;
}
测试
int main(int argc, char const *argv[])
{
int i;
time_t t1, t2;
int year = 2000;
int ret;
for (i = 1; i <= 12; i++) {
get_month_start_end_utime(year, i, &t1, &t2);
//get_month_start_end_utime_safe(year, i, &t1, &t2);
printf("%d:\n", i);
printf("%s", ctime(&t1));
printf("%s", ctime(&t2));
}
return 0;
}
注意
mktime得到的时间是本地时间,而不是0时区时间