Moment.js - besok, hari ini dan kemarin

116

Saya ingin moment().fromNow()fungsinya, tetapi ketika tanggalnya dekat, itu terlalu tepat - mis. Saya tidak ingin itu muncul 'dalam 3 jam' tetapi 'hari ini' - jadi pada dasarnya dengan ketepatan 'harian'.

Saya mencoba menggunakan moment().calendar()fungsinya, itu tidak memformat jika perbedaan tanggal lebih dari 1 hari

Ziarno
sumber

Jawaban:

120

Anda juga bisa melakukan ini untuk mendapatkan tanggal hari ini dan besok dan kemarin

let today     = moment();

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

let yesterday = moment().add(-1, 'days');
HussienK
sumber
ini tidak ada di api resmi! harap berikan polyfill yang Anda miliki untuk ini
Khaled Al-Ansari
lihat dokumen di sini momentjs.com/docs/#/manipulating/add Satu-satunya hal yang saya tambahkan adalah new Date()untuk menghindari peringatan yang terus diberikan lib kepada saya (lihat momentjs.com/docs/#/parsing/now )
HussienK
8
maaf atas suara negatifnya, tapi ini bukan yang saya minta. Saya terkejut bahwa ini adalah jawaban pilihan teratas (pada saat penulisan) ...
Ziarno
8
Memang benar, saya benar-benar menambahkannya sebagai referensi untuk diri saya sendiri dan orang lain yang mungkin berakhir di sini karena bagaimana judul pertanyaan diutarakan. Sepertinya itu membantu banyak orang, yang membuat saya senang. :)
HussienK
2
Apakah new Date()dibutuhkan? Saya pikir moment()menghasilkan contoh momen menggunakan tanggal hari ini
Craig Myles
37

Anda dapat menyesuaikan cara the .fromNowdan .calendarmetode menampilkan tanggal menggunakan moment.updateLocale. Kode berikut akan mengubah cara yang .calendarditampilkan sesuai pertanyaan:

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

Berdasarkan pertanyaan tersebut, sepertinya .calendarmetode ini akan lebih tepat - .fromNowingin memiliki prefiks / sufiks masa lalu / sekarang, tetapi jika ingin mengetahui lebih lanjut, Anda dapat membaca dokumentasi di http://momentjs.com / docs / # / customization / relative-time / .

Untuk menggunakan ini hanya di satu tempat alih-alih menimpa lokal, berikan string pilihan Anda sebagai argumen pertama saat Anda mendefinisikan moment.updateLocaledan kemudian memanggil metode kalender menggunakan lokal itu (mis. moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ ))

EDIT: Momen ^ 2.12.0 sekarang memiliki updateLocalemetode. updateLocaledan localetampaknya berfungsi sama, dan localebelum usang, tetapi memperbarui jawaban untuk menggunakan metode yang lebih baru.

svangordon.dll
sumber
1
ini mengubah lokalisasi global, saya hanya perlu ini di 1 tempat :)
Ziarno
Lihat edit - Anda dapat membuat lokal kustom alih-alih menimpa lokal yang ada
svangordon
35

Saya menggunakan kombinasi dari add()dan endOf()dengan momen

//...
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'
//...
guillaumepotier
sumber
21

Persyaratan:

  • Jika tanggalnya semakin jauh, gunakan moment().fromNow()fungsionalitas standar .
  • Ketika tanggal lebih dekat, acara "today", "yesterday", "tomorrow", dll

Larutan:

// 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: Dari versi 2.14.0, argumen format ke fungsi kalender dapat berupa callback, lihat http://momentjs.com/docs/#/displaying/calendar-time/ .

Ben
sumber
19

Anda dapat menggunakan ini:


const today     = moment();

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

const yesterday = moment().subtract(1, 'days');
Alexandr Egorov
sumber
11

Saya memiliki solusi serupa, tetapi memungkinkan untuk menggunakan lokal:

    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'
Adara Hv
sumber
ini berfungsi, tetapi jika Anda mengubah '> = 1' untuk '> = 2' maka Anda akan mendapatkan string 'kemarin', bukan '1 hari yang lalu'.
Dody
10

Dari 2.10.5 saat mendukung menentukan format keluaran kalender per doa Untuk dokumentasi yang lebih rinci, periksa Momen - Kalender .

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

Dari 2.14.0 kalender juga dapat melakukan panggilan balik untuk mengembalikan nilai.

**Moment 2.14.0**
    moment().calendar(null, {
     sameDay: function (now) {
       if (this.isBefore(now)) {
         return '[Will Happen Today]';
       } else {
        return '[Happened Today]';
       }
       /* ... */
      }
    });
pravin
sumber
mengapa suara negatifnya? Beri tahu saya sehingga saya dapat meningkatkan ini
pravin
Inilah jawabannya.
oscarteg
ini adalah jawaban yang benar menurut saya. Tapi itu masih tidak mengembalikan hasil jenis "3 hari yang lalu" kecuali sangat disesuaikan
Zorteks
9

Di Moment.js, metode from () memiliki ketepatan harian yang Anda cari:

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"
twernt
sumber
2
terima kasih, tapi masih tidak menampilkan 'hari ini', dan menampilkan ex. '1 hari yang lalu' alih-alih 'kemarin' - sepertinya fungsionalitas yang saya perlukan harus disesuaikan
Ziarno
1
fromtidak memiliki presisi harian. Misalnya, jika kemarin adalah empat jam yang lalu dan saya memilih waktu yang lima jam yang lalu, maka akan tertulis "5 jam yang lalu", bukan kemarin. Solusi ini tidak ada hubungannya dengan ketepatan from, tetapi tanggal berlalu.
Michael Mior
5

Jadi inilah yang akhirnya saya lakukan

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];
}
Ziarno
sumber
Saya memiliki masalah yang sama, tetapi saya perlu menerapkan i18n, dan saya memiliki 10 bahasa ... jadi saya mengandalkan saat internasionalisasi JS ...
Chexpir
3

Anda bisa menggunakan metode .add () dan .subtract () untuk mendapatkan tanggal kemarin dan besok. Kemudian gunakan metode format untuk mendapatkan hanya tanggal .format ("D / M / Y"), D untuk Hari, M untuk Bulan, Y untuk Tahun. Periksa di Dokumen Moment

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

Hasilnya adalah:

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

Inilah cara saya melakukannya menggunakan momen :

  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();
Iffat
sumber
1
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]
Dody
sumber