将时间字符串转换为更清晰的格式

时间:2015-08-10 22:39:13

标签: javascript regex string time

通常有一些神奇的方法可以在javascript中执行某些操作。

以字符串

为例

10h49m02s

并希望将其转换为

10 hours, 49 minutes, 2 seconds

同时避免空闲时间/分钟/秒

EG2

00h10m20s

这就是我正在做的,这可能是搞笑的

var arr = time.split('');
var hourMaj = arr[0];
var hourMin = arr[1];
var minMaj = arr[3];
var minMin = arr[4];
var secMaj = arr[6];
var secMin = arr[7];

var str = "";

if(hourMaj !== '0'){
   str += hourMaj;
   str += hourMin;
}else if (hourMin !== '0'){
  str += hourMin;
}
if(hourMaj !== '0' || hourMin !== '0')
  str += "hours, ";

... and on

2 个答案:

答案 0 :(得分:2)

您实际上可以使用正则表达式来匹配您的值,并且只有当捕获的文本不是零时才用展开的单词替换hms,如下所示:



var re = /\b0*(\d{1,2})h0*(\d{1,2})m0*(\d{1,2})s\b/g; 
var str = '10h49m02s';
var str2 = '00h10m20s';

function func(match, h, m, s) {
  var p = '';
  if (h !== '0') {
    p += h + " hours"
  }
  if (m !== '0') {
    p += (p.length > 0 ? ", " : "") + m + " minutes"
  }
  if (s !== '0') {
    p += (p.length > 0 ? ", " : "") + s + " seconds"
  }
  return p;
}

var res = str.replace(re, func);
document.write(res + "<br/>");
res = str2.replace(re, func);
document.write(res);
&#13;
&#13;
&#13;

正则表达式 - \b0*(\d{1,2})h0*(\d{1,2})m0*(\d{1,2})s\b - 匹配:

  • \b - 字边界
  • 0* - 0个或更多前导零
  • (\d{1,2}) - 小时,1或2位数字
  • h0* - h字面上和0或更多零
  • (\d{1,2}) - 分钟,1或2位数字
  • m0* - m字面上和0或更多零
  • (\d{1,2}) - 秒,1或2位数
  • s\b - s在&#34;字的末尾&#34;。

答案 1 :(得分:2)

与stribizhev的答案类似,但是使用更简单的正则表达式。我已经使用 reduce ,但for循环不再是代码,可能会更快:

&#13;
&#13;
function parseTime(s) {

  // Match sequences of numbers or letters
  var b = s.match(/\d+|[a-z]+/gi);
  var words = {h:'hour', m:'minute', s:'second'};
  var result;

  // If some matches found
  if (b) {

    // Do replacement
    result = b.reduce(function(acc, p, i) {

      // Only include values that aren't zero
      // and skip letters - +p => NaN
      if (+p) {

        // Change letters to words, add plural and store in array
         acc.push(+p + words[b[i+1]] + (p==1? '' : 's'));
      }

      // Pass the accumulator array to the next iteration
      return acc;
    },[])
  }

  // Format the result
  return result.join(', ');
}

document.write(parseTime('00h00m02s') + '<br>');
document.write(parseTime('10h40m02s') + '<br>');
document.write(parseTime('10h00m51s') + '<br>');
document.write(parseTime('01h32m01s'));
&#13;
&#13;
&#13;