Moment.js - ngày mai, hôm nay và hôm qua


114

Tôi muốn moment().fromNow() chức năng, nhưng khi ngày kết thúc, nó quá chính xác - ví dụ: Tôi không muốn nó hiển thị 'sau 3 giờ' mà là 'hôm nay' - về cơ bản với độ chính xác 'hàng ngày'.

Tôi đã thử sử dụng moment().calendar()hàm, nó không định dạng nếu ngày chênh lệch hơn 1 ngày

Câu trả lời:


118

Bạn cũng có thể làm điều này để lấy ngày hôm nay, ngày mai và ngày hôm qua

let today     = moment();

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

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

cái này không có trong api chính thức! vui lòng cung cấp polyfill bạn có cho điều này
Khaled Al-Ansari

xem tài liệu ở đây momentjs.com/docs/#/manipulation/add Điều duy nhất tôi thêm vào là new Date()để tránh cảnh báo mà lib liên tục đưa cho tôi (xem momentjs.com/docs/#/parsing/now )
HussienK

8
xin lỗi vì đã bỏ phiếu xuống, nhưng đây không phải là điều tôi yêu cầu. Tôi ngạc nhiên vì đó là câu trả lời được bình chọn nhiều nhất (tại thời điểm viết bài) ...
Ziarno 21/02

8
Đó là sự thật, tôi thực sự đã thêm nó làm tài liệu tham khảo cho bản thân và những người khác có thể kết thúc ở đây vì cách diễn đạt tiêu đề của câu hỏi. Có vẻ như nó đã giúp được rất nhiều người, tôi rất vui. :)
HussienK

2
new Date()bắt buộc? Tôi nghĩ vẫn moment()tạo ra một ví dụ về khoảnh khắc bằng cách sử dụng ngày hôm nay
Craig Myles

37

Bạn có thể tùy chỉnh cách mà cả phương thức .fromNow.calendarphương thức hiển thị ngày tháng bằng cách sử dụng moment.updateLocale. Đoạn mã sau sẽ thay đổi cách .calendarhiển thị theo câu hỏi:

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

Dựa trên câu hỏi, có vẻ như .calendarphương pháp sẽ phù hợp hơn - .fromNowmuốn có tiền tố / hậu tố trong quá khứ / hiện tại, nhưng nếu bạn muốn tìm hiểu thêm, bạn có thể đọc tài liệu tại http://momentjs.com / docs / # / tùy chỉnh / tương đối-thời gian / .

Để sử dụng điều này chỉ ở một nơi thay vì ghi đè các ngôn ngữ, hãy chuyển một chuỗi bạn chọn làm đối số đầu tiên khi bạn xác định moment.updateLocalevà sau đó gọi phương thức lịch sử dụng ngôn ngữ đó (ví dụ:moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ ) :)

CHỈNH SỬA: Moment ^ 2.12.0 bây giờ có updateLocalephương thức. updateLocalevà có localevẻ giống nhau về mặt chức năng và localevẫn chưa bị phản đối, nhưng đã cập nhật câu trả lời để sử dụng phương pháp mới hơn.


1
điều này thay đổi bản địa hóa toàn cầu, tôi chỉ cần điều này ở một nơi :)
Ziarno

Xem chỉnh sửa - bạn có thể tạo miền địa phương tùy chỉnh thay vì ghi đè lên miền địa phương hiện có
svangordon

35

Tôi sử dụng kết hợp giữa add()endOf()với khoảnh khắc

//...
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

Yêu cầu:

  • Khi ngày xa hơn, hãy sử dụng moment().fromNow()chức năng tiêu chuẩn .
  • Khi ngày là gần gũi hơn, hiển thị "today", "yesterday", "tomorrow"vv

Giải pháp:

// 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 + "]";
        }
    });
}

NB: Từ phiên bản 2.14.0, đối số định dạng cho hàm lịch có thể là một lệnh gọi lại, xem http://momentjs.com/docs/#/displaying/calendar-time/ .


19

Bạn có thể sử dụng cái này:


const today     = moment();

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

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

11

Tôi có giải pháp tương tự, nhưng cho phép sử dụng các ngôn ngữ:

    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'

nó hoạt động, nhưng nếu bạn thay đổi '> = 1' cho '> = 2' thì bạn sẽ nhận được chuỗi 'hôm qua' thay vì '1 ngày trước'.
Dody

10

Từ thời điểm 2.10.5 hỗ trợ chỉ định định dạng đầu ra lịch cho mỗi lần gọi Để xem tài liệu chi tiết hơn, hãy kiểm tra Khoảnh khắc - Lịch .

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

Từ lịch 2.14.0 cũng có thể gọi lại để trả về giá trị.

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

tại sao lại phản đối? Hãy cho tôi biết để tôi có thể cải thiện vấn đề này
pravin

Đây là câu trả lời.
oscarteg

đây là câu trả lời chính xác mà tôi nghĩ. Nhưng nó vẫn không trả "3 days ago" kết quả loại trừ tùy biến rất cao
Zortext

9

Trong Moment.js, phương thức from () có độ chính xác hàng ngày mà bạn đang tìm kiếm:

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
cảm ơn, nhưng nó vẫn không hiển thị 'hôm nay' và hiển thị cũ. '1 day ago' thay vì 'hôm qua' - trông giống như nhu cầu chức năng tôi cần phải tùy chỉnh
Ziarno

1
fromkhông thực sự có độ chính xác hàng ngày. Ví dụ: nếu ngày hôm qua là bốn giờ trước và tôi chọn một thời gian là năm giờ trước, nó sẽ nói "5 giờ trước" thay vì ngày hôm qua. Giải pháp này không có gì để làm với độ chính xác của from, nhưng trong những ngày qua ở.
Michael Mior

5

Vì vậy, đây là những gì tôi đã làm

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];
}

Tôi có cùng một vấn đề, nhưng tôi cần phải áp dụng i18n, và tôi có 10 ngôn ngữ ... vì vậy tôi đã dựa vào sự quốc tế momentJS ...
Chexpir

3

Bạn có thể sử dụng phương thức .add () và .subtract () để lấy ngày hôm qua và ngày mai. Sau đó, sử dụng phương pháp định dạng để chỉ lấy ngày .format ("D / M / Y"), D là viết tắt của Ngày, M cho Tháng, Y cho Năm. Kiểm tra Moment Docs

 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");

Kết quả sẽ là:

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

3

Đây là cách tôi làm điều đó bằng thời điểm :

  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]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.