Sé que puedo hacer cualquier cosa y algunas fechas más envolventes con momentjs. Pero vergonzosamente, me cuesta mucho intentar hacer algo que parece simple: obtener la diferencia entre 2 veces.
Ejemplo:
var now = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";
//expected result:
"00:39:30"
lo que probé:
var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");
console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30
No entiendo qué es ese "10" allí. Vivo en Brasil, así que somos utc-0300 si eso es relevante.
El resultado de moment.duration(now.diff(then))
es una duración con los valores internos correctos:
days: 0
hours: 0
milliseconds: 0
minutes: 39
months: 0
seconds: 30
years: 0
Entonces, supongo que mi pregunta es: ¿cómo convertir una duración momentjs en un intervalo de tiempo? Estoy seguro de que puedo usar
duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")
pero siento que hay algo más elegante que me estoy perdiendo por completo.
actualización
mirando más de cerca, en el ejemplo anterior now
es:
Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}
y moment(moment.duration(now.diff(then)))
es:
Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}
No estoy seguro de por qué el segundo valor está en el horario de verano (-0200) ... pero estoy seguro de que no me gustan las fechas :(
actualización 2
bueno, el valor es -0200 probablemente porque el 31/12/1969 era una fecha en la que se usaba el horario de verano ... así que eso es todo.
Respuestas:
Este enfoque funcionará SOLO cuando la duración total sea inferior a 24 horas:
Si tiene 24 horas o más, las horas se restablecerán a cero con el enfoque anterior, por lo que no es lo ideal.
Si desea obtener una respuesta válida por una duración de 24 horas o más, deberá hacer algo como esto:
Tenga en cuenta que estoy usando el tiempo utc como acceso directo. Podría retirarse
d.minutes()
y pord.seconds()
separado, pero también tendría que ponerlos a cero.Esto es necesario porque la capacidad de formatear una
duration
objeción no está actualmente en moment.js. Se ha solicitado aquí . Sin embargo, hay un complemento de terceros llamado formato de duración de momento que es específicamente para este propósito:fuente
Su problema es pasar el resultado de moment.duration () a moment () antes de formatearlo; esto da como resultado moment () interpretándolo como un tiempo relativo a la época de Unix.
No te da exactamente el formato que estás buscando, pero
moment.duration(now.diff(then)).humanize()
le daría un formato útil como "40 minutos". Si realmente está interesado en ese formato específico, tendrá que construir una nueva cadena usted mismo. Una forma barata sería
[diff.asHours(), diff.minutes(), diff.seconds()].join(':')
donde
var diff = moment.duration(now.diff(then))
. Esto no le da el relleno de cero en valores de un solo dígito. Para eso, es posible que desee considerar algo como el subrayado.cadena , aunque parece un largo camino por recorrer solo para unos pocos ceros adicionales. :)fuente
asHours
lugar dehours
y quitar los decimales. De lo contrario, tendría el mismo problema que captó en mi respuesta. :)[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')
para obtener el resultado deseado. sin un decimal en la primera parteTrabajó para mi
Ver más en http://momentjs.com/docs/#/displaying/difference/
fuente
Si desea una diferencia de dos marcas de tiempo en el total de días, horas y minutos solamente, no en meses y años.
diff contiene 2 meses, 23 días, 23 horas y 20 minutos. Pero necesitamos resultados solo en días, horas y minutos, por lo que la solución simple es:
El resultado final será: 84 días, 23 horas, 20 minutos.
fuente
Cuando llama
diff
, moment.js calcula la diferencia en milisegundos. Si se pasan los milisegundosduration
, se usa para calcular la duración correcta. Sin embargo. cuando pasa los mismos milisegundos almoment()
, calcula la fecha en milisegundos desde (después) el tiempo de época / unix que es el 1 de enero de 1970 (medianoche UTC / GMT). Es por eso que obtienes 1969 como el año junto con la hora equivocada.Entonces, creo que así es como debería hacerlo, ya que moment.js no ofrece la
format
función por la duración. O puede escribir un contenedor simple para hacerlo más fácil / más bonito.fuente
Esto debería funcionar bien.
fuente
Si solo queremos hh: mm: ss, podemos usar una función como esa:
fuente
Utilizar este,
fuente
En vez de
Es mejor hacerlo
fuente
En ES8 usa momento, ahora y comienza a ser objeto de momento.
fuente
Mecanografiado: lo siguiente debería funcionar,
fuente
Creo una función simple con mecanografiado
para generar javascript https://www.typescriptlang.org/play/index.html
fuente
InTime = 06: 38, Outtime = 15: 40
fuente
FECHA HORA ENTRADA BASADA
SALIDA
fuente
DIFERENCIA DE TIEMPO DE ÉPOCA CON MOMENTJS :
Para obtener la diferencia entre dos tiempos de época:
Sintaxis:
moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()
Diferencia en horas:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()
Diferencia en minutos:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()
Nota: Puede eliminar
.toFixed()
si necesita valores precisos.Código:
Consulte el ejemplo de trabajo aquí: https://repl.it/repls/MoccasinDearDimension
fuente