javascript计算两小时的时差

javascript calculate the difference between two hours

有个问题很棘手。创建一个接受字符串参数的函数,例如 2:00 p.m.5:50 a.m.

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

我们有三个静态小时来确定它们与此参数之间的区别。

7:00 a.m. 吃早餐。 12:00 p.m. 吃午饭。 7:00 p.m. 吃晚饭。

该函数应该 return 一个数组,其中第一个和第二个元素代表小时和分钟,如下所示:

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

您可以先创建一个 minutesSinceMidnight() 函数,以获取给定输入字符串自午夜以来的时间(以分钟为单位)。

然后我们将创建 timeToEat() 函数,该函数将从查找下一次用餐时间开始。

找到后,我们将以分钟为单位计算出下一顿饭的时间,并使用以下方法转换为小时和分钟 minutesToHoursAndMinutes() 函数。

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 p.m.', '7:00 p.m.'].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 a.m."));
console.log(timeToEat("5:50 p.m."));
console.log(timeToEat("6:30 p.m."));
.as-console-wrapper { max-height: 100% !important; top: 0; }

您需要一些基本功能来将时间转换为一些可以与其他时间进行比较的通用单位。在这种情况下,可以使用分钟,但也可以使用秒或毫秒。

你可能还需要考虑到时间是在最后一顿饭之后的情况,所以时间就是明天第一顿饭的时间。

以下是经过一些测试的简单实现。理想情况下,数据不会嵌入到 timeToNextMeal 函数中,这样更容易维护。

// Convert timestamp in h:mm ap format to minutes, 
// E.g. 2:30 p.m. 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 p.m.',
    'breakfast': '7:00 a.m.',
    'dinner'   : '7:00 p.m.'
  };
  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)}`
));