C语言应用——判断当前时间是否在一个时间段内(含跨天)
Posted Leung_ManWah
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言应用——判断当前时间是否在一个时间段内(含跨天)相关的知识,希望对你有一定的参考价值。
一、需求
举例有如下几个时间段:
A.0-7点
B.7-20点
C.21-7点
A、B两个时间段判定很简单,只需获取当前时间点对应的小时值,例如当前时间为14点,那么得到小时值为14,然后根据
当前时间 ≥ 开始时间,同时当前时间 < 结束时间
,判断是否处在某个时间段内。但将区间值换成C组配置,那么以上的方法就不再适用。我们来观察下C组的配置,起始时间为21点,结束时间为7点,很明显已经跨天了。
当前时间为0-6点时,以上方法不再适用,所以要增加判断是否结束时间 < 开始时间
。
二、代码
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include "time.h"
static uint8_t startHour = 21;
static uint8_t endHour = 7;
static bool isInTime(uint8_t now)
// 过夜
if(endHour < startHour)
if(now >= endHour && now < startHour)
return false;
else
return true;
// 当天
else
if(now >= startHour && now < endHour)
return true;
else
return false;
int main()
char str[100];
struct tm *time;
uint16_t year, yday;
uint8_t month, day, week, hour, minute, second;
time_t timestamp = 1645444800; /*北京时间2022-02-21 20:00:00*/
/*
几个用于测试的时间戳和北京时间对应
1645444800 = 2022-02-21 20:00:00(北京时间)
1645448400 = 2022-02-21 21:00:00
1645455600 = 2022-02-21 23:00:00
1645459200 = 2020-02-22 00:00:00
1645484400 = 2020-02-22 07:00:00
1645488000 = 2020-02-22 08:00:00
*/
/* 北京时间补偿 */
timestamp += 8*60*60;
/* 调用系统函数 */
time = localtime(×tamp);
year = time->tm_year; /* 自1900年算起 */
month = time->tm_mon; /* 从1月算起,范围0-11 */
week = time->tm_wday; /* 从周末算起,范围0-6 */
yday = time->tm_yday; /* 从1月1日算起,范围0-365 */
day = time->tm_mday; /* 日: 1-31 */
hour = time->tm_hour; /* 小时:0-23点,UTC+0时间 */
minute = time->tm_min; /* 分钟:0-59 */
second = time->tm_sec; /* 0-60,偶尔出现的闰秒 */
/* 时间校正 */
year += 1900;
month += 1;
week += 1;
printf("UNIX时间戳:%d\\r\\n", timestamp);
printf("开始时间:%d点\\r\\n结束时间:%d点\\r\\n", startHour, endHour);
/* 格式化时间字符串 */
strftime(str, 100, "%F %T", time); /* 2020-07-01 02:16:51 */
printf("%s\\r\\n", str);
if(isInTime(hour))
printf("在时间段内\\r\\n", str);
else
printf("不在时间段内!!!\\r\\n", str);
return 0;
测试结果:
• 由 Leung 写于 2022 年 2 月 22 日
• 参考:Java判断某时间是否在一个时间段
判定某个小时是否处于一个时间区间的实现(含跨天)
以上是关于C语言应用——判断当前时间是否在一个时间段内(含跨天)的主要内容,如果未能解决你的问题,请参考以下文章