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

Convert string of time to cleaner format

在 javascript 中通常有一些神奇的方法来做某事。

以字符串为例

10h49m02s

并想将其转换为

10 hours, 49 minutes, 2 seconds

同时避免空hours/minutes/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

您实际上可以使用正则表达式来匹配您的值,并且仅当捕获的文本不为零时才用扩展词替换 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);

正则表达式 - \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 结尾 "word".

与 stribizhev 的回答类似,但正则表达式要简单得多。我使用了 reduce 但是 for 循环不再需要代码而且可能会更快:

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'));