Moment.js - morgen, heute und gestern


111

Ich möchte die moment().fromNow()Funktionalität, aber wenn das Datum nahe ist, ist es zu genau - z. Ich möchte nicht, dass es "in 3 Stunden" angezeigt wird, sondern "heute" - also im Grunde genommen mit einer "täglichen" Präzision.

Ich habe versucht, die moment().calendar()Funktion zu verwenden. Sie wird nicht formatiert, wenn der Datumsunterschied mehr als 1 Tag beträgt

Antworten:


116

Sie können dies auch tun, um das Datum für heute und morgen und gestern zu erhalten

let today     = moment();

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

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

Dies ist nicht in der offiziellen API! Bitte geben Sie die Polyfüllung an, die Sie dafür haben
Khaled Al-Ansari

siehe die Dokumente hier momentjs.com/docs/#/manipulating/add Das einzige, was ich hinzufüge, ist new Date(), eine Warnung zu vermeiden, die mir die Bibliothek immer wieder gibt (siehe momentjs.com/docs/#/parsing/now )
HussienK

8
Entschuldigung für die Abwertung, aber darum habe ich nicht gebeten. Ich bin überrascht, dass es die am besten gewählte Antwort ist (im Moment des Schreibens) ...
Ziarno

8
Es ist wahr, ich habe es wirklich als Referenz für mich und andere hinzugefügt, die möglicherweise hier landen, weil der Titel der Frage so formuliert ist. Sieht so aus, als hätte es vielen Menschen geholfen, worüber ich mich freue. :)
HussienK

2
Ist das new Date()erforderlich? Ich dachte moment(), dass mit dem heutigen Datum ohnehin ein Moment erzeugt wurde
Craig Myles

37

Sie können die Art .fromNowund Weise anpassen, in der sowohl die als auch die .calendarMethoden Datumsangaben mit verwenden moment.updateLocale. Der folgende Code ändert die .calendarAnzeige gemäß der Frage:

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

Basierend auf der Frage scheint die .calendarMethode angemessener zu sein - .fromNowmöchte ein Präfix / Suffix für Vergangenheit / Gegenwart haben, aber wenn Sie mehr erfahren möchten, können Sie die Dokumentation unter http://momentjs.com lesen / docs / # / customization / relative-time / .

Um dies nur an einer Stelle zu verwenden, anstatt die Gebietsschemas zu überschreiben, übergeben Sie eine Zeichenfolge Ihrer Wahl als erstes Argument, wenn Sie das definieren, moment.updateLocaleund rufen Sie dann die Kalendermethode mit diesem Gebietsschema auf (z. B. moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ )).

EDIT: Moment ^ 2.12.0 hat jetzt die updateLocaleMethode. updateLocaleund localescheinen funktional gleich zu sein und localesind noch nicht veraltet, haben aber die Antwort aktualisiert, um die neuere Methode zu verwenden.


Dies ändert die globale Lokalisierung, ich brauche dies nur an einer Stelle :)
Ziarno

Siehe Bearbeiten - Sie können benutzerdefinierte Gebietsschemas erstellen, anstatt vorhandene Gebietsschemas zu überschreiben
svangordon

35

Ich benutze eine Kombination von add()und endOf()mit Moment

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

20

Bedarf:

  • Wenn das Datum weiter entfernt ist, verwenden Sie die Standardfunktionalität moment().fromNow().
  • Wenn das Datum näher, zeigen "today", "yesterday", "tomorrow"etc.

Lösung:

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

Hinweis: Ab Version 2.14.0 kann das Formatargument für die Kalenderfunktion ein Rückruf sein, siehe http://momentjs.com/docs/#/displaying/calendar-time/ .


19

Sie können dies verwenden:


const today     = moment();

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

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

11

Ich habe eine ähnliche Lösung, erlaube aber die Verwendung von Gebietsschemas:

    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'

es funktioniert, aber wenn Sie '> = 1' für '> = 2' ändern, erhalten Sie die Zeichenfolge 'gestern' anstelle von 'vor 1 Tag'.
Dody

9

In Moment.js hat die from () -Methode die tägliche Genauigkeit, nach der Sie suchen:

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
danke, aber es zeigt immer noch nicht 'heute' an und zeigt ex an. 'Vor 1 Tag' statt 'Gestern' - sieht so aus, als müsste die Funktionalität, die ich brauche, benutzerdefiniert sein
Ziarno

1
fromhat nicht wirklich tägliche Präzision. Wenn beispielsweise gestern vor vier Stunden war und ich eine Zeit vor fünf Stunden auswähle, wird anstelle von gestern "vor 5 Stunden" angezeigt. Diese Lösung hat nichts mit der Genauigkeit zu tun from, sondern mit den Daten, die übergeben wurden.
Michael Mior

9

Ab 2.10.5 unterstützt moment die Angabe von Kalenderausgabeformaten pro Aufruf. Eine ausführlichere Dokumentation finden Sie unter Moment - Kalender .

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

Ab 2.14.0 kann der Kalender auch einen Rückruf entgegennehmen, um Werte zurückzugeben.

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

Warum die Abstimmungen? Lassen Sie mich wissen, damit ich diese Ans
Pravin

Das ist die Antwort.
Oscar

Das ist die richtige Antwort, denke ich. Aber es gibt immer noch kein Ergebnis vom Typ "vor 3 Tagen" zurück, es sei denn, es wurde stark angepasst
Zortext

5

Das habe ich also getan

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

Ich habe das gleiche Problem, aber ich muss i18n anwenden, und ich habe 10 Sprachen ... also habe ich mich auf die Internationalisierung von momentJS verlassen ...
Chexpir

3

Sie können die Methoden .add () und .subtract () verwenden, um das Datum von gestern und morgen abzurufen. Verwenden Sie dann die Formatierungsmethode, um nur das Datumsformat ("D / M / Y") abzurufen. D steht für Tag, M für Monat, Y für Jahr. Check in 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");

Ergebnis wird sein:

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

3

So mache ich das mit 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();

1
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.