ปัญหา
เราต้องเขียนฟังก์ชัน JavaScript ที่รับสตริงเวลาในรูปแบบ "HH:MM:SS" แต่สตริงเวลาหลายตัวเสียหาย โดยส่วนนาที (MM) อาจเกิน 60 และวินาที (SS) ก็อาจเกิน 60 เช่นกัน ฟังก์ชันควรแก้ไขสตริงและคืนค่าสตริงที่ถูกต้อง
เช่น:
"08:11:71" → "08:12:11"
ตัวอย่าง
โค้ดตัวอย่างด้านล่าง:
const str = '08:11:71';
const rectifyTime = (str = '') => {
if (!Boolean(str)) {
return str;
}
const re = /^(\d\d):(\d\d):(\d\d)$/;
if (!re.test(str)) {
return null;
}
let [h, m, s] = str.match(re).slice(1, 4).map(Number);
let time = h * 3600 + m * 60 + s;
s = time % 60;
m = (time / 60 | 0) % 60;
h = (time / 3600 | 0) % 24;
return [h, m, s]
.map(String)
.join(':');
};
console.log(rectifyTime(str));
ผลลัพธ์
08:12:11
คำอธิบายเพิ่มเติม
วิธีแก้คือแปลงเป็นวินาทีทั้งหมด แล้วคำนวณย้อนกลับเป็น ชั่วโมง:นาที:วินาที ใช้ bitwise OR (|0) แทน Math.floor() เพื่อความเร็ว ควรจัดการกรณีเวลาลบหรือเกิน 24 ชั่วโมง