01/10/2018, 08:17

Tính toán thời gian trong Python

Chào các bạn!
Mình có một bài tập như sau mong các bạn giúp đỡ.
Ví dụ: Giả sử mình nhập 2 công việc cần làm (CV1 và CV2) bị trùng nhau về thời gian thực hiện như sau.
CV1: từ 08:00 15/12/2016 đến 15:00 15/12/2016
CV2: từ 10:00 15/12/2016 đến 17:30 15/12/2016 (tổng thời gian làm: 7.5h)
Đề bài yêu cầu: sau khi nhập thời gian hai CV trên, do bị trùng về thời gian thực hiện nên hệ thống sẽ phải sắp xếp thời gian cần để hoàn thành hai CV trên (chỉ tính trong giờ hành chính từ 8h đến 12h và từ 13h30 đến 18h) theo quy luật CV nào bắt đầu trc thì làm trc rồi mới bắt đầu CV2 ngay sau khi hoàn thành CV1.
Vậy output mong muốn sẽ là:
CV1: từ 08:00 15/12/2016 đến 15:00 15/12/2016
CV2: từ 15:00 15/12/2016 đến 14:00 16/12/2016 (tổng thời gian làm vẫn là 7,5h)
Mình đã giải quyết được phần quy luật sắp xếp thứ tự các CV. Tuy nhiên gặp vấn đề khi tính toán thời gian do chưa tìm được cách để hệ thống chỉ tính toán thời gian trong giờ hành chính, chứ không bị tràn ra ngoài 18h hoặc trước 8h chẳng hạn.
MÌnh trình bày có phần hơi lủng củng do cũng kb phải viết ntn. Các bạn thông cảm
Cảm ơn m.n!

Thành Phạm viết 10:17 ngày 01/10/2018

Bạn up code đã viết lên được không? Sửa code nhanh hơn code từ đầu

Ho Dong Tu viết 10:23 ngày 01/10/2018

Mai bạn nhé. Code mình để ở văn phòng rồi. K mang về nhà được

*grab popcorn* viết 10:22 ngày 01/10/2018

Tại sao cv2 lại có tổng thời gian là 7.5h nhưng cv1 lại ko tính thời gian làm v bạn nhỉ :?
Mình chưa hiểu chỗ đó lắm.

Vì giả sử như cv2, cv1 làm từ 8h-15h -> 7h làm việc.
Vậy cv phải từ 8h -> 16h30 mới đủ 7h làm việc :?

Ho Dong Tu viết 10:20 ngày 01/10/2018

Vì CV1 bắt đầu trc nên mình không cần quan tâm nó phải hoàn thành trong bao nhiêu thời gian bạn ạ. Mình chỉ cần quan tâm CV2 phải đc xếp ngay sau khi kết thúc CV1, đủ thời gian cần để hoàn thành và thời gian đó phải năm trong giờ hành chính.

*grab popcorn* viết 10:22 ngày 01/10/2018

Vậy thì ta có thế này, mình nói theo ý mình hiểu đề

B1: Tính tgian hành chính còn lại khi xong cv1 (timeLeft)
B2: Nếu tgian cv2 (time2) < timeLeft -> kq = thời điểm kt cv1 + time2 + 1h30 (+1h30 nếu timeLeft > 4.5)
B3: Còn ko thì số ngày hoàn thành cv2 (dayToFinish) tăng lên 1 và lấy time2 = time2 - timeLeft
B4: Ta biết 1 ngày có 8.5 giờ hành chính. Vậy để tính dayToFinish ta lấy dayToFinish += time2 / 8.5. Vì là ngày nên ta chỉ lấy phần nguyên.
B5: Sau đó ta lấy tiếp timeToFinish = time2 mod 8.5 là ra được thời gian còn lại để hoàn thành cv2 sau dayToFinish ngày
B6: tính giờ hoàn thành cv = 8 + (timeToFinish) + 1.5 (finishTime) Tương tự như B1. +1.5 khi timeToFinish > 4

Vd:
B1: timeLeft = 18h-15h = 3
B2: time2 = 7.5, timeLeft = 3 -> time2 > timeLeft; tới B3
B3: dayToFinish = 1; time2 = time2 - timeLeft = 4.5
B4: 4.5 / 8.5 = 0.xxxx. Lấy phần nguyên -> 0. Vậy dayToFinish ko đổi.
B5: timeToFinish = 4.5 mod 8.5 = 4.5
B6: finishTime = 8 + 4.5 + 1.5 = 14h

-> Tgian bắt đầu cv2 là thời điểm kết thúc cv1
Tgian kết thúc cv2 thì như trên
= 14h, (15/12 + dayToFinish) = 14h ngày 16/12

Ho Dong Tu viết 10:28 ngày 01/10/2018

Ở B1 và B2. Giả sử thời gian ntn:
CV1 : từ 08:00 15/12/2016 đến 15:00 16/12/2016
CV2: từ 10:00 15/12/2016 đến 17:30 16/12/2016
Vậy làm thế nào để có thể tính chính xác được timeLeft và time2 hả bạn?

*grab popcorn* viết 10:32 ngày 01/10/2018

time2 mình tính liên tục rồi mới từ đó chia ra theo ca.
Như vd của bạn thì time2 = 24-10 + 17.5 = 14 + 17.5 = 31.5
Còn timeLeft thì chỉ tính tgian trong ngày cv1 hoàn thành thôi.
Như trên là còn lại 3h trong ngày 16/12. Tất nhiên sẽ có 1 số th như tgian hoàn thành ko nằm trong khung giờ hành chính. Cái này bạn tự xử nhé :~

Bài liên quan
0