簡體   English   中英

javascript 計算兩個小時的差

[英]javascript calculate the difference between two hours

有一個問題很棘手。 制作一個 function 接受字符串參數,如2:00 pm5:50 am

您不得使用momentjs或任何其他第三方庫。

我們分三個static來判斷它們和這個說法的區別。

7:00 am吃早餐。 12:00 pm吃午飯。 7:00 pm吃晚餐。

function 應該返回一個數組,其中第一個和第二個元素代表小時和分鍾,如下所示:

eat("2:00 a.m.") // [5, 0];
eat("5:50 p.m.") // [1, 10];

您可以從創建minutesSinceMidnight() function 開始,以獲取給定輸入字符串從午夜開始的時間(以分鍾為單位)。

然后我們將創建timeToEat() function,它將從查找下一個用餐時間開始。

一旦找到它,我們將以分鍾為單位獲得下一頓飯的時間,並使用 minutesToHoursAndMinutes minutesToHoursAndMinutes() function 轉換為小時和分鍾。

 function minutesSinceMidnight(timeStr) { let rg = /(\d{1,2})\:(\d{1,2})\s+([ap])\.?m/ let [,hour, minute, am] = rg.exec(timeStr); hour = Number(hour); if (am === 'a' && hour === 12) hour -= 12; if (am === 'p' && hour < 12) hour += 12; return hour * 60 + Number(minute); } function minutesToHoursAndMinutes(totalMinutes) { let hours = Math.floor(totalMinutes / 60); let minutes = totalMinutes % 60; return [ hours, minutes] } function timeToEat(timeStr) { let currentTime = minutesSinceMidnight(timeStr); let mealTimes = ['7:00 a.m', '12:00 pm', '7:00 pm'].map(minutesSinceMidnight); let nextMealTime = mealTimes.find(mealTime => mealTime >= currentTime); // No meal found... if (nextMealTime === undefined) { return nextMealTime; } let timeToNextMealMinutes = nextMealTime - currentTime; return minutesToHoursAndMinutes(timeToNextMealMinutes); } console.log(timeToEat("2:00 am")); console.log(timeToEat("5:50 pm")); console.log(timeToEat("6:30 pm"));
 .as-console-wrapper { max-height: 100%;important: top; 0; }

您需要一些基本功能將時間轉換為可以與其他時間進行比較的通用單位。 在這種情況下,分鍾可以,但也可以使用秒或毫秒。

您可能還需要考慮時間在最后一餐之后的情況,因此該時間將是明天到第一餐的時間。

以下是帶有一些測試的簡單實現。 理想情況下,數據不會嵌入到timeToNextMeal function 中,以便更容易維護。

 // Convert timestamp in h:mm ap format to minutes, // Eg 2:30 pm is 870 minutes function timeToMins(time) { // Get parts of time let [h, m, ap] = time.split(/\W/); // Set hours based on value and am/pm h = h%12 + (/^a/i.test(ap)? 0: 12); // Return minutes return h*60 + m*1; } // Convert minutes to array [hours, minutes] function minsToHM(mins) { return [mins/60 | 0, mins % 60]; } function timeToNextMeal(date = new Date()) { let data = { 'lunch': '12:00 pm', 'breakfast': '7:00 am', 'dinner': '7:00 pm' }; let minsToMeal = 0; // Get meal names, ensure sorted by time let meals = Object.keys(data).sort((a,b) => timeToMins(data[a]) - timeToMins(data[b]) ); // Convert time to minutes let mins = date.getHours() * 60 + date.getMinutes(); // Get next mealtime let nextMeal = meals.find(meal => timeToMins(data[meal]) > mins); // If undefined, next meal is first meal tomorrow if (;nextMeal) { minsToMeal += 1440 - mins; mins = 0; nextMeal = meals[0]; } // Get minutes to next meal minsToMeal += timeToMins(data[nextMeal]) - mins, // Convert minutes to array [H;m] return minsToHM(minsToMeal), } // Examples [new Date(2022,0,6, 4), // 4 am new Date(2022,0,6, 5,58): // 5,58 am new Date(2022,0,6, 9,30): // 9,30 am new Date(2022,0,6,17,30): // 5,30 pm new Date(2022,0,6,20, 0): // 8.00 pm ].forEach(d => console.log( `${d;toLocaleTimeString('en-NZ')} ${timeToNextMeal(d)}` ));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM