2013-08-03 3 views
1

Поэтому в основном у меня есть две строки временных меток, которые я хочу добавить:Добавьте две метки формата «HH +: MM: SS»

a = "00:10:12"; 
aParts = a.split(/:/); 

b = "00:30:34"; 
bParts = b.split(/:/); 

time1 = 3600000 * parseInt(aParts[0]) + 60000 * parseInt(aParts[1]) + 1000 * parseInt(aParts[2]); 
time2 = 3600000 * parseInt(bParts[0]) + 60000 * parseInt(bParts[1]) + 1000 * parseInt(bParts[2]); 

dateTime = time1 + time2; 

hours = parseInt(dateTime/3600000); 
dateTime = parseInt(dateTime%3600000); 

minutes = parseInt(dateTime/60000); 
dateTime = parseInt(dateTime%60000); 

seconds = parseInt(dateTime/1000); 

newTime = addLeadingZeros(hours,2) + ':' + addLeadingZeros(minutes,2) + ':' + addLeadingZeros(seconds,2); 

// returns correct "00:40:46" 

function addLeadingZeros (n, length){ 
    var str = (n > 0 ? n : -n) + ""; 
    var zeros = ""; 
    for (var i = length - str.length; i > 0; i--) 
    zeros += "0"; 
    zeros += str; 
    return n >= 0 ? zeros : "-" + zeros; 
} 

Во время написания этого вопроса я сумел придумать выше код: -), который работает как-то - это правильный способ добавления двухстрочных временных меток или есть лучший подход?

Забыл упомянуть - я попытался преобразовать две строки в объекты Date и использовать .getTime(), добавляя два времени datetime, но это дает мне неправильное время в дате.

+0

почему вы используете регулярный формат времени, почему у не использовать 'новый Date() GetTime();'. который возвращает время в миллисекундах? – CME64

+0

Забыл упомянуть - я попытался преобразовать две строки в объекты Date и использовать .getTime(), добавляя два времени datetime, но это дает мне неправильное время в дате. – owsata

+0

, конечно же, вы добавите два разных раза (включая дату), вы можете отфильтровать дату в одном из них, если хотите добавить их вместе пример: 'dateTime = time1 + time2% 216000000;/* возвращает миллисекунды только временной части (1000 * 60 * 60 * 60). */' – CME64

ответ

0

Там нет ничего особенно плохого в вашем коде, но не забудьте установить radix при использовании parseInt

базисного

Целого числа, которое представляет собой десятичные значения для синтаксического анализа. Всегда укажите этот параметр, чтобы устранить путаницу считывателя и гарантировать предсказуемое поведение. Различные реализации производят разные результаты, когда редикс не указан.

Нет стандартного метода для выполнения описанной вами задачи.

Вот пример, который я использовал в прошлом.

Javascript

/*jslint maxerr: 50, indent: 4, browser: true, devel: true */ 

(function() { 
    "use strict"; 

    function zeroPad(num) { 
     var str = num.toString(); 

     if (num < 2) { 
      str = "0" + str; 
     } 

     return str; 
    } 

    function addTimes() { 
     if (!arguments.length) { 
      throw new SyntaxError("No arguments provided."); 
     } 

     var total = { 
       hours: 0, 
       minutes: 0, 
       seconds: 0 
      }, 
      argIndex, 
      argLength, 
      time, 
      parts, 
      part, 
      partIndex, 
      temp; 

     for (argIndex = 0, argLength = arguments.length; argIndex < argLength; argIndex += 1) { 
      time = arguments[argIndex]; 
      if (typeof time !== "string") { 
       throw new TypeError("Argument must be a string."); 
      } 

      parts = time.split(":"); 
      if (parts.length !== 3) { 
       throw new SyntaxError("Argument is incorrectly formatted."); 
      } 

      for (partIndex = 0; partIndex < 3; partIndex += 1) { 
       part = parts[partIndex]; 
       if (partIndex < 2) { 
        if (part === "" || !/^\d*$/.test(part)) { 
         throw new SyntaxError("Argument is incorrectly formatted."); 
        } 

        parts[partIndex] = parseInt(part, 10); 
       } else { 
        if (part === "" || !/^\d*\.?\d+$/.test(part)) { 
         throw new SyntaxError("Argument is incorrectly formatted."); 
        } 

        parts[partIndex] = parseFloat(part); 
       } 
      } 

      temp = (parts[2] + total.seconds); 
      total.seconds = temp % 60; 
      temp = (parts[1] + total.minutes) + (temp - total.seconds)/60; 
      total.minutes = temp % 60; 
      total.hours = (parts[0] + total.hours) + (temp - total.minutes)/60; 
     } 

     return zeroPad(total.hours) + ":" + zeroPad(total.minutes) + ":" + zeroPad(total.seconds); 
    } 

    var a = "00:10:12", 
     b = "00:30:34", 
     c = "10:40:40"; 

    console.log(addTimes(a, b, c)); 
}()); 

Выход

11:21:26 

На jsfiddle

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