2017-01-10 2 views
0

У меня есть массив дней. Каждый день - это объект с открытым/закрытым временем. 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>

Я не уверен, о подходе, и если механизм может быть нарушен?

+0

Этот вопрос отчасти сбивает с толку. У вас есть три дня, но вы хотите получить единственный результат с открытой датой/временем и близкой датой/временем, но эти даты должны быть только на один день? Почему первая и последняя даты не были бы на три дня друг от друга? –

ответ

0

Это похоже на прекрасный подход. Единственное, что я вижу в том, что если есть время открытия 24 часа вы должны использовать:

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

вместо:

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

Я до сих пор не уверен, что конечная точка вы стремитесь, но код, который у вас есть, можно упростить, не преобразовывая вещи из чисел в строки и обратно.

Я удалил константу CURRENT_TIME, поскольку она не использовалась нигде. Если вы хотите его вернуть, просто используйте методы и т. Д., Чтобы получить нужные значения, а не форматировать и умножать строки.

Я также беру на себя ответ Борре.

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>

Смежные вопросы