typescriptで、ある時間が特定の時間の範囲内かどうか調べる関数を作成したので公開します。
関数の中身はこちら。
ソースコード
TimeUtil.ts
function isBetween(checkTime: string, startTime?: string, endTime?: string): boolean {
// 時間の正規表現
const regexp = new RegExp(/^([01][0-9]|2[0-3]):([0-5][0-9])$/)
// check time validate
if (checkTime == null || !regexp.test(checkTime)) return false
const checkExec = regexp.exec(checkTime)
if (checkExec == null) return false
const checkHour = Number(checkExec[1])
const checkMinutes = Number(checkExec[2])
// 開始時間、終了時間指定
if (startTime && endTime) {
// validate
if (!regexp.test(String(startTime)) || !regexp.test(endTime)) return false
const startExec = regexp.exec(startTime)
const endExec = regexp.exec(endTime)
if (startExec == null || endExec == null) return false
const startHour = Number(startExec[1])
const startMinutes = Number(startExec[2])
const endHour = Number(endExec[1])
const endMinutes = Number(endExec[2])
// 時間のチェック
if (startHour <= checkHour && checkHour < endHour) return true
return (
(startHour === checkHour || endHour === checkHour) &&
startMinutes <= checkMinutes &&
checkMinutes <= endMinutes
)
// 開始時間のみ指定
} else if (startTime) {
// validate
if (!regexp.test(startTime)) return false
const startExec = regexp.exec(startTime)
if (startExec == null) return false
const startHour = Number(startExec[1])
const startMinutes = Number(startExec[2])
// 時間のチェック
if (startHour < checkHour) return true
return startHour === checkHour && startMinutes <= checkMinutes
// 終了時間のみ指定
} else if (endTime) {
// validate
if (!regexp.test(endTime)) return false
const endExec = regexp.exec(endTime)
if (endExec == null) return false
const endHour = Number(endExec[1])
const endMinutes = Number(endExec[2])
// 時間のチェック
if (checkHour < endHour) return true
return checkHour === endHour && checkMinutes <= endMinutes
}
return false
}
時間の書式はHH:mm
になります。
checkTimeが確認したい時間、 startTimeは時間の範囲の開始時間、 endTimeは時間の範囲の終了時間。
startTimeのみ指定の場合は、checkTimeがstartTime以降かどうか。 endTimeのみ指定の場合は、checkTimeがendTime以前かどうかという判定になります。
テストコード
テストコードはこちらになります。
TimeUtil.test.ts
/**
* isBetweenのテスト
*/
describe('TimeUtil isBetweenのテスト', () => {
test('startTime & endTime', () => {
const startTime = '09:00'
const endTime = '17:00'
expect(isBetween('01:00', startTime, endTime)).toBe(false)
expect(isBetween('01:25', startTime, endTime)).toBe(false)
expect(isBetween('01:50', startTime, endTime)).toBe(false)
expect(isBetween('08:57', startTime, endTime)).toBe(false)
expect(isBetween('08:58', startTime, endTime)).toBe(false)
expect(isBetween('08:59', startTime, endTime)).toBe(false)
expect(isBetween('09:00', startTime, endTime)).toBe(true)
expect(isBetween('09:01', startTime, endTime)).toBe(true)
expect(isBetween('09:02', startTime, endTime)).toBe(true)
expect(isBetween('16:57', startTime, endTime)).toBe(true)
expect(isBetween('16:58', startTime, endTime)).toBe(true)
expect(isBetween('16:59', startTime, endTime)).toBe(true)
expect(isBetween('17:00', startTime, endTime)).toBe(true)
expect(isBetween('17:01', startTime, endTime)).toBe(false)
expect(isBetween('17:02', startTime, endTime)).toBe(false)
expect(isBetween('17:03', startTime, endTime)).toBe(false)
expect(isBetween('23:00', startTime, endTime)).toBe(false)
expect(isBetween('23:20', startTime, endTime)).toBe(false)
expect(isBetween('23:40', startTime, endTime)).toBe(false)
})
test('startTime only', () => {
const startTime = '09:00'
expect(isBetween('00:00', startTime)).toBe(false)
expect(isBetween('00:30', startTime)).toBe(false)
expect(isBetween('08:00', startTime)).toBe(false)
expect(isBetween('08:30', startTime)).toBe(false)
expect(isBetween('08:59', startTime)).toBe(false)
expect(isBetween('09:00', startTime)).toBe(true)
expect(isBetween('09:01', startTime)).toBe(true)
expect(isBetween('18:00', startTime)).toBe(true)
expect(isBetween('18:15', startTime)).toBe(true)
expect(isBetween('18:30', startTime)).toBe(true)
})
test('endTime only', () => {
const endTime = '17:00'
expect(isBetween('09:00', undefined, endTime)).toBe(true)
expect(isBetween('09:20', undefined, endTime)).toBe(true)
expect(isBetween('09:40', undefined, endTime)).toBe(true)
expect(isBetween('16:59', undefined, endTime)).toBe(true)
expect(isBetween('17:00', undefined, endTime)).toBe(true)
expect(isBetween('17:01', undefined, endTime)).toBe(false)
expect(isBetween('18:00', undefined, endTime)).toBe(false)
expect(isBetween('18:20', undefined, endTime)).toBe(false)
expect(isBetween('18:40', undefined, endTime)).toBe(false)
})
})
以上でした!