2014-11-25 3 views
1

Я пытаюсь вычислить формулу для вычисления доли часа. Я хочу разбить час на шесть минут. Это означает, что я бы в следующей таблице:Время округления в JavaScript

Input        Output 
-----        ------ 
5 hrs 0 mins      5.0 
5 hrs 1 min      5.0 
5 hrs 2 mins      5.0 
5 hrs 3 mins      5.0 

5 hrs 4 mins      5.1 
5 hrs 5 mins      5.1 
5 hrs 6 mins      5.1 
5 hrs 7 mins      5.1 
5 hrs 8 mins      5.1 
5 hrs 9 mins      5.1 

5 hrs 10 mins      5.2 
5 hrs 11 mins      5.2 
5 hrs 12 mins      5.2 
5 hrs 13 mins      5.2 
5 hrs 14 mins      5.2 
5 hrs 15 mins      5.2 

5 hrs 16 mins      5.3 
... 

В настоящее время я следующее:

var d = new Date(); 
var h = d.getHours(); 
var m = d.getMinutes(); 
var fraction = Math.floor(m/60); 

var result = h + '.' + fraction; 

дробная часть не работает правильно. Есть что-то о округлении и т. Д., Что я не уверен, как обращаться в этой ситуации. Я был бы благодарен всем, кто может помочь мне в решении этой проблемы.

Спасибо!

+4

Ну, «м» всегда будет меньше 60, поэтому 'm/60' всегда будет фракцией. Вызов '.floor()' с этим всегда будет производить 0. Что делать, если вы разделите его на '6', так как это интересующая вас единица? – Pointy

+0

'fraction = (m/60) .toFixed (1)' – pawel

ответ

2

Необходимо правильно ввести логику format a duration with javascript. Логика необходима для рассмотрения последних минут через час. Следующие должны работать на вас:

function FormatDuration(duration) { 
    // Retrieve the hours and minutes 
    var hrs = duration.getHours(); 
    var mins = duration.getMinutes(); 

    // Convert the minutes to a fraction of an hour. 
    var tenths = ((mins/60).toFixed(1) * 10); 
    if (tenths === 10) { 
    tenths = 0; 
    hrs = hrs + 1; 
    } 
    return hrs + '.' + tenths; 
} 
1

Разделение на 60 всегда будет давать вам значение от 0 до 1, то есть floor() всегда будет возвращать 0 (если m не равно 60). Вы можете разделить на 6 вместо:

var fraction = Math.floor(m/6); 

Тесты:

Math.floor(6/6);  // 1 
Math.floor(3/6);  // 0 
Math.floor(30/6); // 5 
Math.floor(59/6); // 9 
+2

, который как будто делит на 6 вместо 60 ... – Pointy

+0

@Pointy doh! Это даже не понедельник, поэтому у меня нет оправдания ... –

+0

Не чувствую себя плохо - мне пришлось попробовать его на листе бумаги, чтобы убедиться, что я правильно понял :) – Pointy

0

Я не знаю, если это правильно, но это, кажется, соответствует Вашим телефонам:

var fraction = Math.round(m/6.1)/10; 

Я использовал 6.1 нажимать номера вниз, как только через 6 3 минут становится .1 вместо 4 минут становится .1

Это приводит к 58 и 5 9 минут - целый 1.0, который увеличит ваши часы до следующего. Не уверен, что это именно то, что вы хотите, так как ваши образцы занимают до 16 минут.

Я придумал это, играя в excel с номерами от 0 до 59. Это отличный способ проверить эти проблемы.

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