【问题标题】:Remove trailing string for date formatting删除日期格式的尾随字符串
【发布时间】:2017-01-02 13:08:40
【问题描述】:

我正在使用Moment Duration Format,它很棒。在某些情况下,我只是无法获得正确的字符串格式。

这些是我当前的字符串输出类型如下

var dur = moment.duration(d, "minutes").format("h [hrs] m [min]");
  1. 45 分钟
  2. 1 小时 30 分钟
  3. 2 小时 0 分钟

这些都是正确的输出,我只是希望能够改变最终的类型。

当存在小时数且分钟数为 时,我想修剪字符串以仅显示小时数

所以

2 小时 0 分钟 变成 2 小时

我不确定从哪里开始 regex ?我认为这可能是实现它的唯一方法?

感谢您的帮助

【问题讨论】:

  • 根据文档,您可以使用{ trim: "right" } 作为设置参数从右侧修剪。也许这有帮助。
  • 没有帮助 - 我试过了。没有小时数时返回 0 小时 45 分钟等值
  • 我认为正确的解决方案是为 moment 的格式化系统实现更好的解析器,但做起来要复杂得多。也许替换 0 min 模式可能是一个更简单的解决方案,或者为分钟不为零时创建不同的格式。
  • @LenilsondeCastro 我已经更新了我的答案。希望它涵盖了大多数情况。
  • @DogCoffee 请检查答案中的更新。我添加了对secsecs 等的处理。

标签: javascript regex string momentjs


【解决方案1】:

使用包装函数代替正则表达式,检查对象是否有值,如果没有,则更新格式字符串。

function getFormattedString(duration) {
  var format = "";
  if (duration.hours()) format += "h [hrs] ";
  if (duration.minutes()) format += "m [min] "
  if (duration.seconds()) format += "s [sec] ";
  return duration.format(format)
}

console.log(getFormattedString(moment.duration(20, "minutes")))
console.log(getFormattedString(moment.duration(100, "minutes")))
console.log(getFormattedString(moment.duration(120, "minutes")))
console.log(getFormattedString(moment.duration(3701, "seconds")))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>

更新代码(通用包装器

  • yeardays 等添加了选项
  • 添加了静态地图以使代码通用
  • 添加了对1 sec10 secs 的处理。

function getFormattedDurationString(value, unit) {
  const valueMap = [
    {name:'years', value:'y', unitValue:'yr'},
    {name:'days', value:'d', unitValue:'day'},
    {name:'hours', value:'h', unitValue:'hr'},
    {name:'minutes', value:'m', unitValue:'min'},
    {name:'seconds', value:'s', unitValue:'sec'},
    {name:'milliseconds', value:'s', unitValue:'ms', bypassPlural: true},
  ]

  var duration = moment.duration(value, unit);
  var format = valueMap.reduce(function(p,c){
  var val = duration[c.name]();
  if(val >0){
    p += c.value + " [" + c.unitValue +  (val > 1 && !c.bypassPlural ? "s":"") + "] ";
  }
  return p
}, "")
return duration.format(format)
}

console.log(getFormattedDurationString(20, "minutes"))
console.log(getFormattedDurationString(100, "minutes"))
console.log(getFormattedDurationString(120, "minutes"))
console.log(getFormattedDurationString(3701, "seconds"))
console.log(getFormattedDurationString(3701, "days"))
console.log(getFormattedDurationString(3701, "milliseconds"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>

【讨论】:

  • 我觉得你也应该把原来的放上来。
  • @DogCoffee 完成。但我想当前代码将涵盖更多案例,并且还处理 secsecs 案例,因此更推荐。
  • 感谢您的帮助 - 非常好的答案。
猜你喜欢
  • 2022-01-07
  • 2015-04-03
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
相关资源
最近更新 更多