Moment.js-明天,今天和昨天


115

我想要该moment().fromNow()功能,但是当日期临近时,它太精确了-例如。我不希望它显示为“ 3小时内”,而是显示“今天”内-因此基本上具有“每日”精度。

我尝试使用该moment().calendar()功能,如果日期差超过1天,则不会格式化

Answers:


119

您还可以执行此操作以获取今天以及明天和昨天的日期

let today     = moment();

let tomorrow  = moment().add(1,'days');

let yesterday = moment().add(-1, 'days');

这不在官方的api中!请为此提供您所需的polyfill
Khaled Al-Ansari

在这里看到的文档momentjs.com/docs/#/manipulating/add我补充一点的是new Date()避免了警告的lib一直给我(见momentjs.com/docs/#/parsing/now
HussienK

8
对不起,投反对票,但这不是我要的。我很惊讶这是(在撰写本文时)获得最高投票的答案……
Ziarno

8
的确如此,我确实将其添加为自己和其他人的参考,这些人可能因为问题标题的用词方式而落到这里。看起来它帮助了很多人,对此我感到很高兴。:)
HussienK

2
new Date()必需的吗?我以为moment()还是使用今天的日期生成了一个瞬间的实例
Craig Myles

37

您可以使用来定制.fromNow.calendar方法同时显示日期的方式moment.updateLocale。以下代码将更改.calendar根据问题显示的方式:

moment.updateLocale('en', {
    calendar : {
        lastDay : '[Yesterday]',
        sameDay : '[Today]',
        nextDay : '[Tomorrow]',
        lastWeek : '[Last] dddd',
        nextWeek : '[Next] dddd',
        sameElse : 'L'
    }
});

根据问题,似乎该.calendar方法更合适- .fromNow想要有一个过去/现在的前缀/后缀,但是如果您想了解更多信息,可以阅读http://momentjs.com上的文档。/ docs /#/ customization / relative-time /

仅在一个地方,而不是使用这个覆盖区域设置的,通过你选择的字符串作为第一个参数,当你定义moment.updateLocale,然后调用使用该区域设置日历法(如moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ )

编辑:时刻^ 2.12.0现在具有该updateLocale方法。updateLocale并且locale在功能上似乎相同,并且locale尚未弃用,但已更新了答案以使用较新的方法。


1
这改变了全球本地化,我只需要一个地方就可以了:)
Ziarno

查看编辑-您可以创建自定义语言环境,而不是覆盖现有语言环境
svangordon '16

35

我使用的组合add(),并endOf()与时刻

//...
const today = moment().endOf('day')
const tomorrow = moment().add(1, 'day').endOf('day')

if (date < today) return 'today'
if (date < tomorrow) return 'tomorrow'
return 'later'
//...

21

要求:

  • 如果日期较远,请使用标准moment().fromNow()功能。
  • 当日期接近,显示"today""yesterday""tomorrow"等。

解:

// call this function, passing-in your date
function dateToFromNowDaily( myDate ) {

    // get from-now for this date
    var fromNow = moment( myDate ).fromNow();

    // ensure the date is displayed with today and yesterday
    return moment( myDate ).calendar( null, {
        // when the date is closer, specify custom values
        lastWeek: '[Last] dddd',
        lastDay:  '[Yesterday]',
        sameDay:  '[Today]',
        nextDay:  '[Tomorrow]',
        nextWeek: 'dddd',
        // when the date is further away, use from-now functionality             
        sameElse: function () {
            return "[" + fromNow + "]";
        }
    });
}

注意:从2.14.0版开始,日历函数的format参数可以是回调,请参见http://momentjs.com/docs/#/displaying/calendar-time/


19

您可以使用此:


const today     = moment();

const tomorrow  = moment().add(1, 'days');

const yesterday = moment().subtract(1, 'days');


11

我有类似的解决方案,但允许使用语言环境:

    let date = moment(someDate);
    if (moment().diff(date, 'days') >= 1) {
        return date.fromNow(); // '2 days ago' etc.
    }
    return date.calendar().split(' ')[0]; // 'Today', 'yesterday', 'tomorrow'

它可以工作,但是如果将“> = 1”更改为“> = 2”,则将获得“昨天”字符串,而不是“ 1天前”字符串。

10

从2.10.5版本开始,Moment-Calendar支持从每次调用指定日历输出格式。

**Moment 2.10.5**
moment().calendar(null, {
  sameDay: '[Today]',
  nextDay: '[Tomorrow]',
  nextWeek: 'dddd',
  lastDay: '[Yesterday]',
  lastWeek: '[Last] dddd',
  sameElse: 'DD/MM/YYYY'
});

从2.14.0开始,日历也可以通过回调返回值。

**Moment 2.14.0**
    moment().calendar(null, {
     sameDay: function (now) {
       if (this.isBefore(now)) {
         return '[Will Happen Today]';
       } else {
        return '[Happened Today]';
       }
       /* ... */
      }
    });

为什么要下票?让我知道,以便我可以改善此问题
pravin

这就是答案。
oscarteg

我认为这是正确的答案。但是除非高度定制,否则它仍不会返回“ 3天前”类型的结果
Zortext

9

在Moment.js中,from()方法具有您正在寻找的每日精度:

var today = new Date();
var tomorrow = new Date();
var yesterday = new Date();
tomorrow.setDate(today.getDate()+1);
yesterday.setDate(today.getDate()-1);

moment(today).from(moment(yesterday)); // "in a day"
moment(today).from(moment(tomorrow)); // "a day ago" 

moment(yesterday).from(moment(tomorrow)); // "2 days ago" 
moment(tomorrow).from(moment(yesterday)); // "in 2 days"

2
谢谢,但它仍然不显示“今天”,并显示前。“ 1天前”而不是“昨天”-看起来我需要自定义的功能
Ziarno

1
from并没有真正的日常精度。例如,如果昨天是四个小时前,而我选择的时间是五个小时前,它将显示“ 5小时前”而不是昨天。该解决方案无关的精度from,但传递的日期。
迈克尔Mior

5

所以这就是我最后要做的

var dateText = moment(someDate).from(new Date());
var startOfToday = moment().startOf('day');
var startOfDate = moment(someDate).startOf('day');
var daysDiff = startOfDate.diff(startOfToday, 'days');
var days = {
  '0': 'today',
  '-1': 'yesterday',
  '1': 'tomorrow'
};

if (Math.abs(daysDiff) <= 1) {
  dateText = days[daysDiff];
}

我有同样的问题,但是我需要应用i18n,并且我有10种语言...所以我依靠的是JS国际化的瞬间...
Chexpir

3

您可以使用.add()和.subtract()方法获取昨天和明天的日期。然后使用format方法仅获取日期.format(“ D / M / Y”),D代表日,M代表月,Y代表年。签入时刻文档

 let currentMilli = Date.now()
 let today = Moment(currentMilli).format("D/M/Y");
 let tomorrow = Moment(currentMilli).add(1, 'days').format("D/M/Y");
 let yesterday = Moment(currentMilli).subtract(1, 'days').format("D/M/Y");

结果将是:

Current Milli - 1576693800000
today - 19/12/2019
tomorrow - 18/12/2019
yesterday - 18/12/2019

3

这是我使用moment的方法

  let today = moment().format('DD MMMM YYYY');

  let tomorrow = moment().add(1, 'days').format('DD MMMM YYYY').toString();

  let yesterday = moment().subtract(1, 'days').startOf('day').format('DD MMMM YYYY').toString();

1
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.