一力奋、需求
舉例有如下幾個(gè)時(shí)間段:
A.0-7點(diǎn)
B.7-20點(diǎn)
C.21-7點(diǎn)
A景殷、B兩個(gè)時(shí)間段判定很簡(jiǎn)單澡屡,只需獲取當(dāng)前時(shí)間點(diǎn)對(duì)應(yīng)的小時(shí)值,例如當(dāng)前時(shí)間為14點(diǎn)绩蜻,那么得到小時(shí)值為14室埋,然后根據(jù)
當(dāng)前時(shí)間 ≥ 開始時(shí)間,同時(shí)當(dāng)前時(shí)間 < 結(jié)束時(shí)間
姚淆,判斷是否處在某個(gè)時(shí)間段內(nèi)。但將區(qū)間值換成C組配置降淮,那么以上的方法就不再適用上忍。我們來觀察下C組的配置,起始時(shí)間為21點(diǎn)腋颠,結(jié)束時(shí)間為7點(diǎn)吓笙,很明顯已經(jīng)跨天了。
當(dāng)前時(shí)間為0-6點(diǎn)時(shí)絮蒿,以上方法不再適用叁鉴,所以要增加判斷是否結(jié)束時(shí)間 < 開始時(shí)間
。
二但壮、代碼
#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;
}
}
// 當(dāng)天
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; /*北京時(shí)間2022-02-21 20:00:00*/
/*
幾個(gè)用于測(cè)試的時(shí)間戳和北京時(shí)間對(duì)應(yīng)
1645444800 = 2022-02-21 20:00:00(北京時(shí)間)
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
*/
/* 北京時(shí)間補(bǔ)償 */
timestamp += 8*60*60;
/* 調(diào)用系統(tǒng)函數(shù) */
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; /* 小時(shí):0-23點(diǎn),UTC+0時(shí)間 */
minute = time->tm_min; /* 分鐘:0-59 */
second = time->tm_sec; /* 0-60焦辅,偶爾出現(xiàn)的閏秒 */
/* 時(shí)間校正 */
year += 1900;
month += 1;
week += 1;
printf("UNIX時(shí)間戳:%d\r\n", timestamp);
printf("開始時(shí)間:%d點(diǎn)\r\n結(jié)束時(shí)間:%d點(diǎn)\r\n", startHour, endHour);
/* 格式化時(shí)間字符串 */
strftime(str, 100, "%F %T", time); /* 2020-07-01 02:16:51 */
printf("%s\r\n", str);
if(isInTime(hour))
{
printf("在時(shí)間段內(nèi)\r\n", str);
}
else
{
printf("不在時(shí)間段內(nèi)!E纺肌仆抵!\r\n", str);
}
return 0;
}
測(cè)試結(jié)果:
? 由 Leung 寫于 2022 年 2 月 22 日
? 參考:Java判斷某時(shí)間是否在一個(gè)時(shí)間段
判定某個(gè)小時(shí)是否處于一個(gè)時(shí)間區(qū)間的實(shí)現(xiàn)(含跨天)