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

Zia*_*rno 92 javascript date momentjs

我喜欢这个moment().fromNow()功能,但是当日期接近时它太精确了 - 例如.我不希望它在'3小时'但'今天'显示 - 所以基本上是'每日'精度.

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

Hus*_*enK 90

您也可以这样做以获取今天,明天和昨天的日期

let today     = moment(new Date());

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

let yesterday = moment(new Date()).add(-1, 'days');
Run Code Online (Sandbox Code Playgroud)

  • 这是真的,我真的把它作为我自己和其他人的参考,因为问题的标题是如何表达的.看起来它帮助了很多人,我很高兴.:) (7认同)
  • 对不起投票,但这不是我要求的.我很惊讶它是最受欢迎的答案(在写作的那一刻)...... (6认同)
  • 是否需要“new Date()”?我认为 `moment()` 无论如何都使用今天的日期生成了一个 moment 实例 (2认同)

sva*_*don 32

您可以自定义方法.fromNow.calendar方法显示日期的方式moment.updateLocale.以下代码将.calendar根据问题更改显示的方式:

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

基于这个问题,这似乎是.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 个地方:) (2认同)

gui*_*ier 30

我使用的组合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'
//...
Run Code Online (Sandbox Code Playgroud)


小智 18

你可以用这个:


const today     = moment();

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

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

Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 15

要求:

  • 当日期更远时,请使用标准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 + "]";
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

注意:从版本2.14.0开始,日历功能的格式参数可以是回调,请参阅http://momentjs.com/docs/#/displaying/calendar-time/.


Afi*_*han 12

这是我使用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();

Run Code Online (Sandbox Code Playgroud)


Ada*_* Hv 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'
Run Code Online (Sandbox Code Playgroud)

  • 它有效,但如果将 '&gt;=1' 更改为 '&gt;=2' 那么您将得到 '昨天' 字符串而不是 '1 天前'。 (2认同)

twe*_*rnt 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"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但它仍然没有显示'今天',并显示前.'1天前'而不是'昨天' - 看起来我需要的功能需要定制 (2认同)

Zia*_*rno 9

所以这就是我最终做的

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];
}
Run Code Online (Sandbox Code Playgroud)


pra*_*vin 6

从2.10.5开始支持为每次调用指定日历输出格式有关更详细的文档,请检查时刻 - 日历.

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

从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]';
       }
       /* ... */
      }
    });
Run Code Online (Sandbox Code Playgroud)