C语言获取月份开始和结束时间戳

说明

每个月的开始时间为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时区时间

猜你喜欢

转载自blog.csdn.net/bajie7045/article/details/128317650