Hữu ích. Một cảm giác lạnh buốt chạy dọc sống lưng bạn.
Haaaaa. Hơi thở lạnh buốt của sếp phả vào cổ bạn như một cái cống tràn nước. Nhưng bạn không thể bảo họ lượn đi nơi khác...họ đã theo dõi bạn như chim ưng kể từ khi hệ thống theo dõi thời gian ở văn phòng bị hỏng.
Bây giờ, họ chỉ ở đó...lơ lửng...thở. Huffffff.
Đây là cách giải quyết vấn đề của riêng bạn bằng JavaScript. Haaaaa .
Bạn có một bảng chấm công trông giống như nội dung của String
này:
const a = `November 30 2023 13:20-15:00, 15:30-16:40 December 4 2023 15:45-16:15, December 5 2023 08:00-08:30, 18:15-19:30, 21:45-22:15, 22:30-23:00 December 6 2023 19:45-21:45 December 7 2023 14:15-14:45, 15:15-15:45, 16:00-16:30, 16:45-17:15, 18:45-20:15, 20:45-22:45 December 13 2023 03:00-03:50 December 15 2023 09:00-09:30 20:30-21:15 21:45-22:30 23:30-24:00 December 16 2023 23:25-23:55 December 17 2023 19:05-19:50 20:30-21:30 22:15-23:45 December 20 2023 23:30-24:00 December 21 2023 02:20-2:50 03:15-03:30 13:40-14:00 16:00-17:15 17:45-18:45 19:20-20:10 21:30-22:20 23:00 - 24:00 December 22 2023 0:00-0:15`;
Điều này khá dễ dàng. Chúng tôi bắt đầu bằng cách tạo một vài biểu thức chính quy và hàm trợ giúp. Vậy thì chúng ta sẽ… Huuuuffh!
Chúng tôi chia chuỗi bảng chấm công thành các dòng riêng lẻ và bớt chúng để tạo ra một mảng đối tượng
Đối với mỗi lần lặp, chúng tôi:
A. Chia dòng quanh năm bằng cách sử dụng yearRegex
, ghi lại chuỗi ngày
B. Thu thập tất cả các khoảng thời gian bằng cách sử dụng intervalsRegex
C. Giảm theo phạm vi thời gian, phân tích từng phạm vi dưới dạng đối tượng Ngày JavaScript bằng cách sử dụng trình trợ giúp parseDate
và chuỗi ngày từ bước 2.A
Giảm bớt mảng đối tượng để tìm tổng số giờ
const yearRegex = /(\d{4})/gi; const intervalsRegex = /(\d+\:\d+)\s*-\s*(\d+\:\d+)/gi; const parseDate = (date, time) => Date.parse(`${date} ${time}`); let times = [...a.split("\n")].reduce((arr, entryLine) => { let entryLineSplit = entryLine.split(yearRegex); let o = { date: entryLineSplit[0] + entryLineSplit[1], timeRanges: [...entryLine.matchAll(intervalsRegex)], }; o.hoursForDay = o.timeRanges.reduce((total, [x, start, end]) => { let s = parseDate(o.date, start); let e = parseDate(o.date, end); return total + (e - s) / 1000 / 60 / 60; }, 0); return [...arr, o]; }, []); console.log(times); let totalHours = times.reduce((total, { hoursForDay }) => total + hoursForDay, 0); console.log(totalHours);
Nếu bạn bỏ ghi chú console.log(times);
câu lệnh, bạn sẽ thấy một mảng chứa các đối tượng như:
{ date: 'November 30 2023', timeRanges: [ [ '13:20-15:00', '13:20', '15:00', index: 17, input: 'November 30 2023 13:20-15:00, 15:30-16:40', groups: undefined ], [ '15:30-16:40', '15:30', '16:40', index: 30, input: 'November 30 2023 13:20-15:00, 15:30-16:40', groups: undefined ] ], totalHours: 2.8333333333333335 },
Date.parse
.
String.prototype.split
, kết quả này có thể không phải là duy nhất tùy thuộc vào việc hai ngày có bao gồm các khoảng thời gian giống nhau hay không.times
. Để tối ưu hóa mã này, tốt hơn nên sử dụng một mức giảm duy nhất trên một đối tượng trống chứa các trường totalHours
và times
.
Bây giờ bạn đã biết cách trích xuất thời gian từ một bảng chấm công lộn xộn. Với một chút nỗ lực, bạn thậm chí có thể tạo ra một chiếc đồng hồ đúng giờ. Nhưng khi đó bạn sẽ không có cơ hội dành toàn bộ thời gian quý giá đó để tìm hiểu sếp của mình, phải không? Huffff.