Momento js: muestra días y horas de una date

Estoy trabajando en un proyecto que requiere este tipo de respuesta de text en un object de date.

"1 día 7 horas" — tiene que ser de esta manera – no "31 horas fuera" o "1 día fuera" – también estoy usando el momento js – ya que estoy cambiando de idioma entre inglés y alemán – entonces He aprovechado el idioma de momento.js

moment.locale('de') 

Estoy usando el momento js – actualmente he creado un object de date falso

  var futureDate = new Date() futureDate.setDate(futureDate.getDate() + 1)// add a day futureDate.setHours(7)// add 7 hours 

cuando bash renderizar el momento js

 moment(futureDate).endOf('day').fromNow() 

solo dice "en un día"

¿Cómo modifico la function de momento para manejar 1 día y 7 horas y quizás vuelva a ajustar la oración?

— fragment de código bash

 moment.locale('de') // switch between en and de -- english and german var futureDate = new Date() futureDate.setDate(futureDate.getDate() + 1)// add a day futureDate.setHours(7)// add 4 hours // Results in hours console.log(moment(futureDate).endOf('day').fromNow()); 
 <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script> 

código de testing 2 usando la diferencia

 moment.locale('de') // switch between en and de -- english and german var a = moment(); var b = moment(a).add(31, 'hours'); // Results in days console.log(b.diff(a, 'days')); console.log(b.diff(a, 'days', true)); 
 <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script> 

Puedes hacerlo con moment-duration-format o con moment.diff así:

 let futureDate = new Date () futureDate.setDate (futureDate.getDate () + 1)// add a day futureDate.setHours (7) let start = moment () let end = moment (futureDate) // 1st solution: with moment-duration-format console.log (moment.duration (end.diff (start)).format ('d [days] hh [hours]', { trim: false })) // 2nd solution: diff without moment-duration-format let hoursDuration = end.diff (start, 'hours') console.log (Math.floor (hoursDuration / 24) + ' days ' + (hoursDuration % 24) + ' hours') 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script> 

Puede usar relativeTimeThreshold y relativeTime (key de moment.updateLocale ) para personalizar cómo el momento muestra la hora relativa (por ejemplo, la salida fromNow() ).

En tu caso, puedes:

  • Ajuste el umbral para get la diferencia en segundos (consulte: ¿Cómo hacer que moment.js muestre el time relativo en segundos? ).
  • Cree un object de duración usando moment.duration(Number, String) .
  • Utilice el plugin de formatting de duración de momento para mostrar el valor de duración en el formatting que prefiera.

Aquí una muestra en vivo:

 var momEn = moment().add({d:1, h:7}); var momDe = moment().locale('de').add({d:1, h:7}); console.log(momEn.fromNow()); // in a day console.log(momDe.fromNow()); // in einem Tag // Change relativeTimeThreshold moment.relativeTimeThreshold('s', 60*60*24*30*12); // Update relative time moment.updateLocale('en', { relativeTime : { s: function (number, withoutSuffix, key, isFuture){ return moment.duration(number, 's').format('d [day] h [hour]'); }, } }); moment.updateLocale('de', { relativeTime : { s: function (number, withoutSuffix, key, isFuture){ return moment.duration(number, 's').format('d [Tag] h [Uhr]'); }, } }); console.log(momEn.fromNow()); // in 1 day 7 hour console.log(momDe.fromNow()); // in 1 Tag 7 Uhr 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script> 

Editar: como mencionaste que te gustaría seguir con Moment.js, tienen el moment#diff disponible:

 var a = moment([2007, 0, 29]); var b = moment([2007, 0, 28]); a.diff(b, 'days') // 1 

Encontrado de: https://stackoverflow.com/a/42187373/2803743


Usaría countdown.js para esto.

 var futureDate = new Date() futureDate.setDate(futureDate.getDate() + 1)// add a day futureDate.setHours(7)// add 7 hours var timePassed = countdown(Date.now().toString(), futureDate, countdown.DAYS|countdown.HOURS); console.log(timePassed); 

timePassed es un object encantador; en este ejemplo:

  days: 0 end: Tue Jul 04 2017 07:17:41 GMT+0300 (EEST) hours: 12 start: Mon Jul 03 2017 19:17:41 GMT+0300 (EEST) units: 18 value: 43200000 

Que luego puede concat a su cadena deseada.

Realmente no está bien documentado, pero la lib también tiene un CDN https://cdnjs.com/libraries/countdown