Javascript 返回字符串:';天';或';月份';或';年';基于N天

Javascript 返回字符串:';天';或';月份';或';年';基于N天,javascript,vue.js,momentjs,Javascript,Vue.js,Momentjs,我正在vue 3上使用moment.js。 我有一个函数,它返回两个日期的差值。这是可行的,但与我的问题有关。函数的编写方式如下: methods: { getDateDifference (date) { var date = moment(date, 'YYYY MM DD') var today = moment() return today.diff(date, 'days') } } 现在,我可以成功地获得传递给函数的

我正在
vue 3
上使用
moment.js
。 我有一个函数,它返回两个
日期的差值
。这是可行的,但与我的问题有关。函数的编写方式如下:

methods: {
    getDateDifference (date) {
        var date = moment(date, 'YYYY MM DD')
        var today = moment()
        return today.diff(date, 'days')
    } 
}
现在,我可以成功地获得传递给函数的
日期与今天的
日期的差异。问题是我想检查返回的
days
是否大于一周但小于一个月,以便将其转换为
weeks
,而不是显示
28天
等。。如果可能的话,我想包括当返回的
天数大于28天时是否应使用
而不是周,如果返回的天数大于或等于

简而言之,不是显示

26 days
我需要它来检查它是否可以转换为周,以便我可以将其呈现为:

3 weeks

或者,如果我可以在
中渲染它,您可以使用一个数组,将天的阈值与结果的粒度关联起来

const periods = [
    {threshold: 366, period: "years"},
    {threshold: 31, period: "months"},
    {threshold: 7, period: "weeks"},
    {threshold: 0, period: "days"}
];

days = today.diff(date, "days");
for (let i = 0; i < periods.length; i++) {
    if (days >= periods[i].threshold) {
        return today.diff(date, periods[i].period);
    }
}
const periods=[
{起点:366,期间:“年”},
{阈值:31,期间:“月”},
{阈值:7,周期:“周”},
{阈值:0,句点:“天”}
];
天=今天.diff(日期,“天”);
for(设i=0;i=时段[i]。阈值){
今天返回.diff(日期,期间[i].period);
}
}

您可以使用一个数组,将天数内的阈值与结果的粒度关联起来

const periods = [
    {threshold: 366, period: "years"},
    {threshold: 31, period: "months"},
    {threshold: 7, period: "weeks"},
    {threshold: 0, period: "days"}
];

days = today.diff(date, "days");
for (let i = 0; i < periods.length; i++) {
    if (days >= periods[i].threshold) {
        return today.diff(date, periods[i].period);
    }
}
const periods=[
{起点:366,期间:“年”},
{阈值:31,期间:“月”},
{阈值:7,周期:“周”},
{阈值:0,句点:“天”}
];
天=今天.diff(日期,“天”);
for(设i=0;i=时段[i]。阈值){
今天返回.diff(日期,期间[i].period);
}
}

瞬间
可以通过持续时间api处理此问题:

获取毫秒数:

methods: {
    getDateDifference (date) {
        var date = moment(date, 'YYYY MM DD')
        var today = moment()
        return today.diff(date)
    } 
}
然后使用:

/* don't know the object holding methods */ 
let shortest = moment.duration(obj.methods.getDateDifference(date)).humanize();
如果超过一个月的时间,你会得到几个月而不是几天,几年而不是几个月,等等


瞬间
可以通过持续时间api处理此问题:

获取毫秒数:

methods: {
    getDateDifference (date) {
        var date = moment(date, 'YYYY MM DD')
        var today = moment()
        return today.diff(date)
    } 
}
然后使用:

/* don't know the object holding methods */ 
let shortest = moment.duration(obj.methods.getDateDifference(date)).humanize();
如果超过一个月的时间,你会得到几个月而不是几天,几年而不是几个月,等等


将差异放入变量中。然后你可以使用
if
语句来返回不同的结果。谢谢@Barmar,我刚刚这么做了,但是我真的对编写一个非常大的
if
else
链感到很难过。没有别的办法吗?我发布了一个答案,但它只是一个由4个
if/else
@Barmar组成的链。与我所做的相比,它肯定更小。我试试看。这似乎预示着将差异放入变量中。然后你可以使用
if
语句来返回不同的结果。谢谢@Barmar,我刚刚这么做了,但是我真的对编写一个非常大的
if
else
链感到很难过。没有别的办法吗?我发布了一个答案,但它只是一个由4个
if/else
@Barmar组成的链。与我所做的相比,它肯定更小。我试试看。这看起来像是对你的承诺!这似乎奏效了。但是,
阈值:31,句点,“月”
上有一个小语法错误。但由于我使用的是
momentjs
我想,我将转到@minusFour的答案+1,这对于vanilla js用户来说是一个很好的开始。谢谢!这似乎奏效了。但是,
阈值:31,句点,“月”
上有一个小语法错误。但由于我使用的是
momentjs
我想,我将转到@minusFour的答案+1,这对vanilla js用户来说是一个很好的开始。我不知道那个API!谢谢,我查一下。对于像我这样需要配置
humanize()
输出的用户,最好只使用
momentjs
,您可以通过如下方式传递配置:
humanize(false,{d:7,w:4,m:31,y:365})
不知道该API!谢谢,我查一下。对于像我这样需要配置
humanize()
输出的用户,最好只使用
momentjs
,您可以通过如下方式传递配置:
humanize(false,{d:7,w:4,m:31,y:365})