对工作时间进行某些计算,以便随时返回两个日期

时间:2017-01-10 15:57:03

标签: javascript ecmascript-6 momentjs

我有几天的日子。每一天都是一个打开/关闭时间的对象。 0-1440分钟。例如:

const array = [
 {
  hours: {
   open: 1260, // 21:00 <- same day
   close: 510  // 08:30 <- next day
  }
 },
 {
  hours: {
   open: 1260, // 21:00 <- same day
   close: 510  // 08:30 <- next day
  }
 },
 {
  hours: {
   open: 510, // 08:30 <- same day
   close: 1260  // 21:00 <- same day
  }
 }
];

结果如下:

// if current time is: "2017-01-10T14:53:45Z" for example
{
 open: "2017-01-10T08:30:00Z",
 close: "2017-01-11T21:00:00Z"
}

因此机制应循环遍历数组,找到最小打开,并且最大关闭并了解哪一个过了午夜以添加/减去1天以获得我提到的示例结果。到目前为止我做了什么:

const array = [
 {
  hours: {
   open: 1260, // 21:00 <- same day
   close: 510  // 08:30 <- next day
  }
 },
 {
  hours: {
   open: 1260, // 21:00 <- same day
   close: 510  // 08:30 <- next day
  }
 },
 {
  hours: {
   open: 510, // 08:30 <- same day
   close: 1260  // 21:00 <- same day
  }
 }
];

let range = {};
let temp_from = [];
let temp_to = [];

array.forEach((a) => {
 const { hours } = a;
 const open = moment.utc(hours.open * 60000).format('HH:mm'); // ex 21:00
 const close = moment.utc(hours.close * 60000).format('HH:mm'); // ex 21:00
 const todayUTC = moment.utc();
 const hourUTC = todayUTC.format('H');
 const minutesUTC = todayUTC.format('mm');
 const secondsUTC = todayUTC.format('ss');
 const CURRENT_TIME = (hourUTC * 60) + (minutesUTC * 1) + (secondsUTC / 60); // exact time 0 - 1440
 console.log('open', open.split(':')[0]);
   temp_from.push(
     moment.utc().set({
       hour: open.split(':')[0],
       minute: open.split(':')[1],
       second: 0,
     }).format()
   )
   temp_to.push(
      moment.utc().set({
       hour: close.split(':')[0],
       minute: close.split(':')[1],
       second: 0,
     }).add(hours.open > hours.close ? 1 : 0, 'days').format()
   )
})

console.log(temp_from, temp_to);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>

我不确定这种方法,以及机制是否可以解决?

2 个答案:

答案 0 :(得分:0)

这似乎是一种很好的方法。我唯一看到的是,如果有24小时的开放时间你应该使用:

.add(hours.open >= hours.close ? 1 : 0, 'days').format()

而不是:

.add(hours.open > hours.close ? 1 : 0, 'days').format()

答案 1 :(得分:0)

我仍然不确定你的目标是什么,但你可以通过不将数字从数字转换为字符串然后再转换来简化你的代码。

我删除了CURRENT_TIME常量,因为它没有在任何地方使用。如果您想要它,只需使用hours()等方法来获取所需的值,而不是格式化和乘以字符串。

我也在考虑下面考虑Borre的答案。

const array = [
 {
  hours: {
   open: 1260, // 21:00 <- same day
   close: 510  // 08:30 <- next day
  }
 },
 {
  hours: {
   open: 1260, // 21:00 <- same day
   close: 510  // 08:30 <- next day
  }
 },
 {
  hours: {
   open: 510, // 08:30 <- same day
   close: 1260  // 21:00 <- same day
  }
 }
];

let range = {};
let temp_from = [];
let temp_to = [];

array.forEach((a) => {
 const { hours } = a;
 const open = moment.utc(hours.open * 60000);
 const close = moment.utc(hours.close * 60000);
// startOf('day') will get midnight, UTC for today
 const todayUTC = moment.utc().startOf('day');
// Rather than splitting the time formatted as a string, just use the methods
// provided by Moment.js to get the values you want
   temp_from.push(
     todayUTC.clone().set({
       hour: open.hours(),
       minute: open.minutes(),
       second: 0,
     }).format()
   )
   temp_to.push(
      todayUTC.clone().set({
       hour: close.hours(),
       minute: close.minutes(),
       second: 0,
     }).add(hours.open >= hours.close ? 1 : 0, 'days').format()
   )
})

console.log(temp_from, temp_to);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>