Javascript Moment.js-明天、今天和昨天

Javascript Moment.js-明天、今天和昨天,javascript,date,momentjs,Javascript,Date,Momentjs,我想要moment().fromNow()功能,但是当日期接近时,它太精确了-例如。我不希望它显示“3小时内”,而是“今天”-因此基本上是“每天”精确 我尝试使用moment().calendar()函数,如果moment.js中的日期差超过1天,则该函数不会格式化,该方法具有您想要的每日精度: var today = new Date(); var tomorrow = new Date(); var yesterday = new Date(); tomorrow.setDate(today

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

我尝试使用
moment().calendar()
函数,如果moment.js中的日期差超过1天,则该函数不会格式化,该方法具有您想要的每日精度:

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"

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

moment.updateLocale('en', {
    calendar : {
        lastDay : '[Yesterday]',
        sameDay : '[Today]',
        nextDay : '[Tomorrow]',
        lastWeek : '[Last] dddd',
        nextWeek : '[Next] dddd',
        sameElse : 'L'
    }
});
基于这个问题,似乎
.calendar
方法更合适--
.fromNow
希望有一个过去/现在前缀/后缀,但如果您想了解更多信息,可以在以下位置阅读文档

要仅在一个位置使用此选项,而不是覆盖区域设置,请在定义
moment.updateLocale
时传递您选择的字符串作为第一个参数,然后使用该区域设置调用calendar方法(例如
moment.updateLocale('Dayed-today').calendar(/*moment()或其他*/)


编辑:矩^2.12.0现在有了
updateScale
方法
UpdateScale
locale
在功能上似乎是相同的,而且
locale
还没有被弃用,但是更新了答案以使用更新的方法。

所以这就是我最后要做的

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];
}
var dateText=moment(someDate).from(new Date());
var startOfToday=moment().startOf('day');
var startoffate=时刻(someDate).startOf('day');
var daysDiff=startoffate.diff(startOfToday,“天”);
var天数={
“0”:“今天”,
“-1”:“昨天”,
“1”:“明天”
};

如果(Math.abs(daysDiff)您也可以这样做来获得今天、明天和昨天的日期

let today     = moment();

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

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

我有类似的解决方案,但允许使用区域设置:

    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'

我对力矩使用了
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'
//...
/。。。
const today=moment().endOf('day')
const明天=时刻().add(1,'day').endOf('day'))
如果(日期<今天)返回“今天”
如果(日期<明天)返回“明天”
返回“稍后”
//...

来自2.10.5版的矩支持指定每次调用的日历输出格式 有关更详细的文档检查

从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]';
       }
       /* ... */
      }
    });

要求:

// 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 + "]";
        }
    });
}
  • 当日期较远时,使用标准的
    moment().fromNow()
    功能
  • 日期临近时,显示
    “今天”
    “昨天”
    “明天”
    ,等等
解决方案:

// 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版开始,calendar函数的formats参数可以是回调,请参阅。

您可以使用以下选项:


const today     = moment();

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

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

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

结果将是:

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

以下是我如何使用:


谢谢,但它仍然不显示“今天”,显示的是例如“1天前”而不是“昨天”-看起来我需要从
自定义的功能实际上没有每日精度。例如,如果昨天是4小时前,我选择的时间是5小时前,它将显示“5小时前”而不是昨天。此解决方案与来自的
的精度无关,但与传入的日期无关。这会更改全局本地化,我只需要在1个位置使用它:)请参见编辑--您可以创建自定义本地化,而不是覆盖现有的本地化这不在官方api中!请提供你的polyfill,很抱歉投了反对票,但这不是我想要的。我很惊讶,这是投票最多的答案(在写这篇文章的时候)…这是真的,我真的把它作为我自己和其他人的参考,因为这个问题的标题是如何措辞的。看起来它帮助了很多人,我很高兴。:)这不是“添加”的正式用法吗?是否需要
新日期()?我想
moment()
用今天的日期生成了一个moment的实例,反正我也有同样的问题,但我需要应用i18n,我有10种语言…所以我依赖于momentJS国际化…为什么会有反对票?让我知道,这样我可以改进这个答案。这是我认为正确的答案。但它仍然不会返回“3天前”类型的结果,除非高度自定义的编辑有效,但如果您将“>=2”更改为“>=1”,那么您将得到“昨天”字符串而不是“1天前”。HussienKhaha HussienK的重复答案偷走了我的答案,但他发布了第一条?是的,但这是更改后的
 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
  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();