2015-09-06 7 views
10

Ich möchte die moment.calendar() -Option ohne die Zeit verwenden ... so anstelle von "letzten Dienstag um 17 Uhr" möchte ich "letzten Dienstag". Weiß jemand, ob der Moment dafür eine Lösung hat? Ich fand diese Geige http://jsfiddle.net/nawxZ/, die anscheinend eine Lösung dafür zeigt, aber ich kann nicht sehen, wie das funktionieren soll? dank carlmoment.calendar() ohne die Zeit

function log(str) { 
    $('body').append('<p>' + str + '</p>'); 
} 

log(moment().calendar()); 
log(moment().calendar(true)); 

Antwort

3

moment().calendar() unterstützt benutzerdefinierte Strings und Formatierungsfunktionen formatiert.

moment().calendar(); 
>> "Today at 9:06 AM" 

setzen Sie dann Ihre formatierte Strings

moment.locale('yourlang', { 
    calendar: { 
     lastDay: function() { 
      return '[last]'; 
     }, 
     sameDay: function() { 
      return '[Today]'; 
     } 
    } 
}); 

moment().calendar(); 

// Will now output 
>> "Today" 

sollte es tun. Die docs are an invaluable source

+0

mit Ihrer Lösung Ich brauche für alle unterstützten Sprachen eines App Kalender definieren ..:/ – Luckylooke

+0

3 Jahre her, dass der Fall wäre - ich bin nicht sicher, wie es heute funktioniert! –

+0

heute scheint der gleiche Fall zu sein:/ – Luckylooke

0

Ich erstellte eine eckige Direktive, die einen Kalender nur mit dem Datum zur Verfügung stellt. Wenn Sie nicht angular verwenden, verwenden Sie einfach die Funktion.

app.filter('amCalendarDate', function($translate) { 
    return function(dt) { 
     var md = moment(dt), key = ''; 

     if (!dt || !md || (md + '').toLowerCase() == 'invalid date') 
      return ''; 

     var today = moment(); 
     var diff = today.diff(md, 'days'); 

     if (!diff) 
      key = 'Today'; 
     else if (diff == -1) 
      key = 'Tomorrow'; 
     else if (diff == 1) 
      key = 'Yesterday'; 
     else if (Math.abs(diff) <= 6) { 
      if (diff < 0) 
       key = 'Next'; 
      else 
       key = 'Last'; 

      var days = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); 

      today.day(diff); 

      key += ' ' + days[today.day()]; 
     } 

     if (key) { 
      // if you don't have translate, just return the key 
      return $translate.amCalendarDate[key]; 
     } else 
      return md.format('L'); 
    } 
}); 
10

ab Moment 2.10.5 Sie tun können:

moment(/*your date*/).calendar(null,{ 
    lastDay : '[Yesterday]', 
    sameDay : '[Today]', 
    nextDay : '[Tomorrow]', 
    lastWeek : '[last] dddd', 
    nextWeek : 'dddd', 
    sameElse : 'L' 
}) 

siehe: http://momentjs.com/docs/#/displaying/calendar-time/

+0

Wie kann dies lokalisiert werden? "Heute" für das Gebietsschema "en" und "Heute" für das Gebietsschema "de" bekommen? Danke – Luckylooke

+0

Moment schon hat alle Übersetzungen nur ändern das Gebietsschema mit moment.lang ("de") Überprüfen Sie die Dokumentation –

+0

Ich tat, aber die Ergebnisse werden nicht übersetzt, nur 'Dddd' Teil wird übersetzt. Es dauert [Heute] als statischer Text nicht dynamisch lokalisiert. Überprüfen Sie dies: https://github.com/moment/moment/issues/4439 – Luckylooke

6

das perfekt funktioniert. Versuch es.

(Moment (Zeit) .calendar(). Split ("at")) [0]

+1

Vielen Dank! Beachten Sie, wenn Sie zu irgendwelchen anderen Orten wechseln Sie planen verwenden sollten (vor(). Kalender(). Split (“„)) [0] statt zB. "Aujourd'hui à 16:30" (fr) oder "heute um 16:30 Uhr" (de) würde nicht funktionieren, sonst funktioniert – CREOFF

+0

nicht für andere Gebietsschemata, @CREOFF selbst Ihr Fix funktioniert nicht für einige Gebietsschemas .. weil in einige Orte der Zukunftstag dieser Woche hat zwei Wörter. Zum Beispiel in Lokalität "sk" ist es "Vo štvrtok o 15:30", was "Donnerstag um 15:30" bedeutet. – Luckylooke

+0

@Luckylooke Ja, Sie sollten die Logik für alle Gebietsschemas überprüfen, die Sie unterstützen möchten. Je mehr Sprachen, desto intelligenter sollte Ihr Skript sein. Belgische Standorte sind in der Regel auf NL, FR, DE, EN beschränkt, so dass sie einfacher zu testen sind – CREOFF

0

Wenn Sie an einem Tag Basis keine benutzerdefinierten Zeiten eingestellt haben und arbeiten nur, können Sie diese verwenden Einfache und mehrsprachige Lösung (getestet für EN/DE/FR/IT). (Volle Tage sind immer mit einem 00.00 timetag gespeichert)

let dateParts = moment(DATE).calendar().split(' '), 
    index = dateParts.indexOf('00:00'); 

// ['Yesterday', 'at', '00:00', 'PM'] -> ['Yesterday'] 
dateParts.length = (index !== -1 ? (index - 1) : dateParts.length); 
Verwandte Themen