Рассчитать время в JavaScript - PullRequest
       42

Рассчитать время в JavaScript

14 голосов
/ 26 сентября 2008

У меня есть элемент управления .net 2.0 ascx с текстовыми полями времени начала и окончания. Данные следующие:

txtStart.Text = 19.09.2008 07: 00: 00

txtEnd.Text = 19.09.2008 05: 00: 00

Я хотел бы рассчитать общее время (часы и минуты) в JavaScript и затем отобразить его в текстовом поле на странице.

Ответы [ 7 ]

6 голосов
/ 04 июня 2010
function stringToDate(string) {
        var matches;
    if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2}) (\d{2,2}):(\d{2,2}):(\d{2,2})$/)) {
       return new Date(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[6]);
    } else {
       return null;
    };
}

    function getTimeSpan(ticks) {
        var d = new Date(ticks);
        return {
            hour: d.getUTCHours(), 
            minute: d.getMinutes(), 
            second: d.getSeconds()
        }
    }

    var beginDate = stringToDate('2008-09-19 07:14:00');
    var endDate = stringToDate('2008-09-19 17:35:00');

    var sp = getTimeSpan(endDate - beginDate);
    alert("timeuse:" + sp.hour + " hour " + sp.minute + " minute " + sp.second + " second ");

вы можете использовать getUTCHours () вместо Math.floor (n / 3600000);

5 голосов
/ 26 сентября 2008

Как только ваши форматы даты текстового поля известны заранее, вы можете использовать Функции даты Мэтта Круза в Javascript, чтобы преобразовать их в метку времени, вычесть, а затем записать в получившееся текстовое поле.

Аналогично, JQuery Date Input код для stringToDate может быть адаптирован для ваших целей - ниже приводится строка в формате «YYYY-MM-DD» и преобразуется в объект даты. Временная метка (getTime()) этих объектов может быть использована для ваших расчетов.

stringToDate: function(string) {
    var matches;
    if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2})$/)) {
       return new Date(matches[1], matches[2] - 1, matches[3]);
    } else {
       return null;
    };
}
4 голосов
/ 26 сентября 2008

Я взял то, что сделал @ PConroy , и добавил к нему, выполнив для вас расчеты. Я также добавил регулярное выражение, чтобы убедиться, что время является частью строки для создания объекта даты.

<html>
    <head>
        <script type="text/javascript">
            function stringToDate(string) {
                var matches;
                if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2}) (\d{2,2}):(\d{2,2}):(\d{2,2})$/)) {
                   return new Date(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[6]);
                } else {
                   return null;
                };
            }

            //Convert duration from milliseconds to 0000:00:00.00 format
            function MillisecondsToDuration(n) {
                var hms = "";
                var dtm = new Date();
                dtm.setTime(n);
                var h = "000" + Math.floor(n / 3600000);
                var m = "0" + dtm.getMinutes();
                var s = "0" + dtm.getSeconds();
                var cs = "0" + Math.round(dtm.getMilliseconds() / 10);
                hms = h.substr(h.length-4) + ":" + m.substr(m.length-2) + ":";
                hms += s.substr(s.length-2) + "." + cs.substr(cs.length-2);
                return hms;
            }

            var beginDate = stringToDate('2008-09-19 07:14:00');
            var endDate = stringToDate('2008-09-19 17:35:00');

            var n = endDate.getTime() - beginDate.getTime();

            alert(MillisecondsToDuration(n));
        </script>
    </head>
    <body>
    </body>
</html>

Это довольно грубо, так как я довольно быстро его кодировал, но это работает. Я проверил это. В окне предупреждения отобразится 0010: 21: 00.00 (ЧЧЧЧ: ММ: СС.СС). По сути, все, что вам нужно сделать, это получить значения из текстовых полей.

2 голосов
/ 09 ноября 2009

Ответы выше всего предполагают манипуляции со строками. Вот решение, которое работает с объектами с чистой датой:

var start = new Date().getTime();
window.setTimeout(function(){
  var diff = new Date(new Date().getTime() - start);
  // this will log 0 hours, 0 minutes, 1 second
  console.log(diff.getHours(), diff.getMinutes(),diff.getSeconds());
},1000);
1 голос
/ 02 октября 2012

Я гуглил для вычисления временного интервала в javascript и нашел этот вопрос на SO; к сожалению, текст вопроса и фактический вопрос (требующий только часов и минут) не совпадают ... поэтому я думаю, что я прибыл сюда по ошибке.

Однако я написал ответ на заголовок вопроса - так что, если кто-то еще захочет что-то напечатать «1 год и 15 минут», то это для вас:

function formatTimespan(from, to) {
    var text = '',
        span = { y: 0, m: 0, d: 0, h: 0, n: 0 };

    function calcSpan(n, fnMod) {
        while (from < to) {
            // Modify the date, and check if the from now exceeds the to:
            from = from[fnMod](1);
            if (from <= to) {
                span[n] += 1;
            } else {
                from = from[fnMod](-1);
                return;
            }
        }
    }

    function appendText(n, unit) {
        if (n > 0) {
            text += ((text.length > 0) ? ', ' : '') +
                n.toString(10) + ' ' + unit + ((n === 1) ? '' : 's');
        }
    }

    calcSpan('y', 'addYears');
    calcSpan('m', 'addMonths');
    calcSpan('d', 'addDays');
    calcSpan('h', 'addHours');
    calcSpan('n', 'addMinutes');

    appendText(span.y, 'year');
    appendText(span.m, 'month');
    appendText(span.d, 'day');
    appendText(span.h, 'hour');
    appendText(span.n, 'minute');

    if (text.lastIndexOf(',') < 0) {
        return text;
    }

    return text.substring(0, text.lastIndexOf(',')) + ', and' + text.substring(text.lastIndexOf(',') + 1);
}
0 голосов
/ 11 февраля 2011

Мне нравится подход K3 + KK-MOD, но мне нужно было показывать отрицательные временные диапазоны, поэтому я сделал следующие модификации:


function MillisecondsToDuration(milliseconds) {
   var n = Math.abs(milliseconds);
   var hms = "";
   var dtm = new Date();
   dtm.setTime(n);
   var d = Math.floor(n / 3600000 / 24); // KK-MOD
   var h = "0" + (Math.floor(n / 3600000) - (d * 24)); // KK-MOD
   var m = "0" + dtm.getMinutes();
   var s = "0" + dtm.getSeconds();
   var cs = "0" + Math.round(dtm.getMilliseconds() / 10);
   hms = (milliseconds < 0 ? " - " : "");
   hms += (d > 0 ? d + "." : "") + h.substr(h.length - 2) + ":" + m.substr(m.length - 2) + ":"; // KK-MOD
   hms += s.substr(s.length - 2) + "." + cs.substr(cs.length - 2);
   return hms; }

Я также изменил разделитель 'T' на '.' для моих собственных целей форматирования.

Теперь переданное отрицательное значение, скажем, -360000 (шесть отрицательных минут), даст следующий результат:

- 00: 06: 00

0 голосов
/ 27 июля 2010

Используйте Math.floor (n / 3600000) вместо getUTCHours (), иначе вы потеряете количество часов больше 24.

Например, если у вас 126980000 миллисекунд, это должно быть переведено в 0035: 16: 20.00

Если вы используете getUTCHours (), вы получите неверную строку 0011: 16: 20.00

Лучше вместо этого используйте это (модификации, обозначенные KK-MOD):

function MillisecondsToDuration (n) {
var hms = "";
var dtm = новая дата ();
dtm.setTime (п);
var d = Math.floor (n / 3600000/24); // KK-MOD
var h = "0" + (Math.floor (n / 3600000) - (d * 24)); // KK-MOD
var m = "0" + dtm.getMinutes ();
var s = "0" + dtm.getSeconds ();
var cs = "0" + Math.round (dtm.getMilliseconds () / 10);
hms = (d> 0? d + "T": "") + h.substr (длина h - 2) + ":" + m.substr (длина m - 2) + ":"; // KK-MOD
hms + = s.substr (s.length - 2) + "." + cs.substr (cs.length - 2);
вернуть хмс; }

Итак, теперь 192680000 отображается как 1T11: 16: 20.00, что составляет 1 день 11 часов 16 минут и 20 секунд

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