Eu sei que posso fazer qualquer coisa e mais algumas datas envolventes com momentjs. Mas, embaraçosamente, estou tendo dificuldade em tentar fazer algo que parece simples: conseguir a diferença entre duas vezes.
Exemplo:
var now = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";
//expected result:
"00:39:30"
o que eu tentei:
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
Eu não entendo o que é esse "10" lá. Eu moro no Brasil, então somos utc-0300, se isso for relevante.
O resultado de moment.duration(now.diff(then))
é uma duração com os valores internos corretos:
days: 0
hours: 0
milliseconds: 0
minutes: 39
months: 0
seconds: 30
years: 0
Então, acho que minha pergunta é: como converter um momentjs Duration em um intervalo de tempo? Eu com certeza posso usar
duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")
mas sinto que há algo mais elegante que estou sentindo falta completamente.
atualização
olhando mais de perto, no exemplo acima now
é:
Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}
e moment(moment.duration(now.diff(then)))
é:
Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}
Não sei por que o segundo valor está no horário de verão (-0200) ... mas tenho certeza de que não gosto de datas :(
atualização 2
bem, o valor é -0200 provavelmente porque 31/12/1969 era uma data em que o horário de verão estava sendo usado ... então é isso.
Respostas:
Essa abordagem funcionará APENAS quando a duração total for inferior a 24 horas:
Se você tiver 24 horas ou mais, as horas serão redefinidas para zero com a abordagem acima, portanto, não é o ideal.
Se você deseja obter uma resposta válida por períodos de 24 horas ou mais, precisará fazer algo assim:
Observe que estou usando o tempo utc como um atalho. Você poderia puxar para fora
d.minutes()
ed.seconds()
separadamente, mas também teria que zerá-los.Isso é necessário porque a capacidade de formatar uma
duration
objeção não está atualmente no moment.js. Foi solicitado aqui . No entanto, existe um plug-in de terceiros chamado momento-duração-formato, especificamente para esse fim:fonte
Seu problema é passar o resultado de moment.duration () de volta para moment () antes de formatá-lo; isso resulta em moment () interpretando-o como um tempo relativo à época do Unix.
Não fornece exatamente o formato que você está procurando, mas
moment.duration(now.diff(then)).humanize()
daria a você um formato útil como "40 minutos". Se você realmente gosta dessa formatação específica, precisará criar uma nova string. Uma maneira barata seria
[diff.asHours(), diff.minutes(), diff.seconds()].join(':')
onde
var diff = moment.duration(now.diff(then))
. Isso não fornece o preenchimento zero nos valores de um dígito. Para isso, você pode considerar algo como underscore.string - embora pareça um longo caminho a percorrer apenas para alguns zeros extras. :)fonte
asHours
vez dehours
e retirar os decimais. Caso contrário, teria o mesmo problema que você pegou na minha resposta. :)[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')
para obter o resultado desejado. sem decimal na primeira parteTrabalhou para mim
Veja mais em http://momentjs.com/docs/#/displaying/difference/
fonte
Se você quiser diferença de dois registros de data e hora no total de dias, horas e minutos, não em meses e anos.
diff contém 2 meses, 23 dias, 23 horas e 20 minutos. Mas precisamos de resultados apenas em dias, horas e minutos, para que a solução simples seja:
O resultado final será: 84 dias, 23 horas, 20 minutos.
fonte
Quando você liga
diff
, o moment.js calcula a diferença em milissegundos. Se os milissegundos forem passados paraduration
, eles serão usados para calcular a duração correta. Contudo. quando você passa os mesmos milissegundos paramoment()
, ele calcula a data em milissegundos da (após) época / época unix que é 1º de janeiro de 1970 (meia-noite UTC / GMT). É por isso que você começa 1969 como o ano junto com a hora errada.Então, acho que é assim que você deve fazer, já que o moment.js não oferece
format
função para duração. Ou você pode escrever um invólucro simples para torná-lo mais fácil / mais bonito.fonte
Isso deve funcionar bem.
fonte
Se queremos apenas hh: mm: ss, podemos usar uma função como essa:
fonte
Usa isto,
fonte
Ao invés de
É melhor fazer
fonte
No ES8, use moment, now e comece a ser objetos moment.
fonte
Texto datilografado: a seguir deve funcionar,
fonte
Eu crio uma função simples com texto datilografado
para gerar javascript https://www.typescriptlang.org/play/index.html
fonte
InTime = 06: 38, Outtime = 15: 40
fonte
DATA HORÁRIO DE ENTRADA
RESULTADO
fonte
DIFERENÇA DE TEMPO ÉPOCA USANDO MOMENTOSJS :
Para obter a diferença entre dois tempos da época:
Sintaxe:
moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()
Diferença em Horas:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()
Diferença em minutos:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()
Nota: você pode remover
.toFixed()
se precisar de valores precisos.Código:
Consulte o exemplo de trabalho aqui: https://repl.it/repls/MoccasinDearDimension
fonte