更改 HH:MM:SS 的时间格式

Change time format of HH:MM:SS

我有一个 api 与 django (django-rest-framework) 一起服务,其中 return 一个电影对象及其相关信息进入 Vue 应用程序。其中一项信息是电影时长。

对象:

{
    "movie_id": 13,
    "duration": "17:52:14",
    ...
    ...
},

组件模板:

<div id="movieDetailSynopsis">
    ...
    ...
    <p>Duration: {{movie.duration}}</p>
</div>

持续时间采用这种格式

HH:MM:SS

eg: 02:22:08

但是我想要的是这样的

2h 22m

有没有办法在 django 或 vuejs 或 javascript 中实现这个?

更新:

尝试使用全局过滤器

main.js:

new Vue({
    router,
    components: {App},
    template: '<App/>',
    store,
    filters: {
        durationFormat(value) {
            const duration = moment.duration(value);
            return duration.hours() + 'h ' + duration.minutes() + 's';
        }
    }
}).$mount('#app');

组件模板内:

<div id="movieDetailSynopsis">
    ...
    ...
    <p>Duration: {{movie.duration | durationFormat}}</p>
</div>

但是我得到一个错误:

[Vue warn]: Failed to resolve filter: durationFormat (found in anonymous component - use the "name" option for better debugging messages.)

您可以像这样使用一些基本的 javascript:

var time = "02:22:08";
var timeConverted = parseInt(t.split(':')[0]) + 'h' + ' ' + parseInt(t.split(':')[1]) + 'm';

我只知道 javascript way.try format() 方法。

function format(time){
        return time.replace(/(?:0)?(\d+):(?:0)?(\d+).*/,'h m');
}

["23:12:15","02:03:05"].forEach(function(time){
  console.log(time+" ==> "+format(time));
});

这是使用 Vue 过滤器的好地方。有关过滤器 here 的更多信息。您可以在组件中全局或本地注册过滤器。

这是一个全局过滤器:

Vue.filter('formatTime', function(value) {
  if (value) {
    const parts = value.split(":");
    return +parts[0] + "h " + +parts[1] + "m";
  } else {
    return "unknown"
  }
});

下面是您将如何在模板中使用它:

<p>Duration: {{movie.duration | formatTime}}</p>

注意:您可以使格式化功能更强大 - 这只是一个示例,可帮助您入门并演示如何在 Vue 中使用它。如评论中所述,moment.js 库非常适合 date/time 解析和操作。

Here's a sample (including using moment.js) in codepen.

更新(回复评论)

尝试更新您的 main.js 以像这样注册过滤器:

// register global filter
Vue.filter('durationFormat', function(value) {
  const duration = moment.duration(value);
  return duration.hours() + 'h ' + duration.minutes() + 's';
});

new Vue({
    router,
    components: {App},
    template: '<App/>',
    store,
}).$mount('#app');

您可以制作自己的模板标签:

from django import template

register = template.Library()

@register.simple_tag
def convert_time(value):
    t_list = [t for t in value.split(':')]
    return '{}h {}m'.format(int(t_list[0]), t_list[1])

然后在模板中使用:

{% load your_tags %}
<div id="movieDetailSynopsis">
  ...
  ...
  <p>Duration: {{movie.duration|convert_time}}</p>
</div>

有关详细信息,请查看 Django documentation

您可以创建一个 django 标签过滤器。你的tagfilter.py

from django import template
register = template.Library()

@register.filter
def tagFilter(duration):
    d = duration.split(":")
    hh,mm,ss = d[0],d[1],d[2]
    return "%sh %sm %ss" % (hh,mm,ss) # If you don't want to show the seconds, you may remove it:
    # "%sh %sm" % (hh,mm)

您的 django 模板:

<div id="movieDetailSynopsis">
...
...
<p>Duration: {{movie.duration|tagFilter}}</p>