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

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

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.


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

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


19

Anda dapat menggunakan ini:


const today     = moment();

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

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

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'

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

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"

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

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

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

1
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.