如何通过moment.js跳过毫秒部分的零?

How to skipping zeros in the millisecond section by moment.js?

演示

https://jsfiddle.net/c59zsLux/1/

我想做什么

我想通过moment.js删除毫秒部分的零填充。

例子

0:00:00.000 → 0:0:0

0:16:55.404 → 0:16:55.404

1:00:30.100 → 1:0:30.1

1:09:01.770 → 1:9:1.77

条件

我的工具

/**
 * タイムスタンプを整形して返す
 * 
 * @param {string|integer} ssms 秒(ss)とミリ秒(ms)で構成されたタイムスタンプ e.g. "4080.770" (01:08:00.770)
 * @return {string} showTime e.g. "1:8:0.77"
 */
function formatTimestamp(time = 0)
{
  if(time == 0){
    return "0:0:0";
  }

  var ssms = time.split(".");

  var temp_ss = ssms[0];
  var temp_ms = ssms[1] ? ssms[1] : 0;

  var m = moment.utc(temp_ss * 1000);
  var hms = m.format("H:m:s");

  var ms = removeTrailingZeros("." + temp_ms);

  ms = ms ? ms : "";

  var showTime = hms + ms; 

  return showTime;
}

/**
 * 数字文字列の末尾のゼロを除去して返す
 * 
 * [EXAMPLES]
 * 1 -> 1
 * 10 -> 10
 * 100. -> 100
 * 100.0 -> 100
 * 100.1 -> 100.1
 * 100.10 -> 100.1
 * 100.01 -> 100.01
 * 100.010 -> 100.01
 * '1.2304000' -> 1.2304
 * '1,000.000' -> 1,000
 * 
 * @param {string|integer} value 数字文字列
 * @return {string} value 末尾ゼロを除去した数字文字列
 */
function removeTrailingZeros(value)
{
  var value = value.toString()

  //console.log('Starting with:', value, value.indexOf('.'))

  // ドット(ミリ秒)を含まない場合はそのままの値を返す
  if (value.indexOf('.') === -1) {
    return value;
  }

  var cutFrom = value.length - 1;

  // ゼロの削除を末尾からドットの方向へ繰り返す
  do {
    //console.log('Checking:', value[cutFrom], cutFrom)

    if (value[cutFrom] === '0') {
      cutFrom--;
    }
  }
  while (value[cutFrom] === '0');

  // ドットの位置に来たら処理を終了する
  if (value[cutFrom] === '.') {
    cutFrom--;
  }

  return value.substr(0, cutFrom + 1);
}

我不知道如何在 moment.js 选项中执行此操作,所以我自己实现了它。

我需要你们的一切

如果有更聪明的方法来做到这一点,或者如果它可以通过 moment.js 中的某些选项实现,请告诉我。

谢谢!

如果你知道传入时间的格式,你可以直接告诉 momentum moment.utc() 中的格式。例如,

const time = moment.utc("09:08:09.100", "hh:mm:ss.S"); // Old format here.
const formattedTime = time.format("h:m:s.S"); // New format here.
console.log(formattedTime);    // 9:8:9.1

参考:moment(String, String). If you have more than one incoming formats you can pass them in an array - moment(String, String[])

在你的代码中,虽然我不确定传入的格式。但是可以肯定的是,时刻正在删除小时、分钟和秒的前导零。在毫秒的情况下,您可以使用 parseFloat 删除前导零。

//Everything above this remains the same.

// Remove leading zeros.
  const ms = temp_ms
    ? parseFloat("0." + temp_ms)
        .toString()
        .split(".")[1]
    : "";

  const showTime = `${hms}${ms ? "." + ms : ""}`;
  return showTime;
  1. Remove insignificant trailing zeros from a number?
  2. Remove leading zeros using regular expression
  3. More ways to remove leading zeros

你可以在这里查看代码Codesandbox: Formatting Time using Momentum