Tenho a sensação de que existe uma maneira simples / embutida de fazer isso, mas não consigo encontrar.
Tenho uma duração (em segundos) em um número inteiro e quero exibi-la em um formato amigável.
por exemplo, 3600 seria exibido como "01:00:00" ou "1 hora" ou algo assim.
Eu posso fazer isso com, time_ago_in_words(Time.zone.now+3600)
mas parece um pouco um hack, não há razão para adicionar / subtrair do tempo atual apenas para formatar esse valor. Existe um duration_in_words()
ou algo assim?
obrigado
ruby-on-rails
ruby
datetime
ruby-on-rails-3
cidonia
fonte
fonte
distance_of_time_in_words
e você pode obter o número arredondado passandovague: true
como uma opção.Resumindo:
assumindo que
total_seconds = 3600
Opção 1:
Opção 2:
Opção 3:
use a Opção1 se quiser palavras, a Opção2 se quiser o formato H: M: S, a Opção3 se quiser o formato H: M: S e pode haver mais de 24 horas
fonte
01:00:00
.O
%
operador de string de Ruby é muito pouco apreciado e frequentemente esquecido.Dado que t é uma duração em segundos, isso emite uma string separada por dois pontos com zeros, incluindo dias. Exemplo:
Encantador.
fonte
%
diz: "Pegue a matriz de parâmetros da minha direita e insira-os na string de formato à minha esquerda." Nesse aspecto, é semelhante aoprintf
C \ C ++, apenas mais conciso e pode ser usado em uma atribuição. Sim, eu chamo isso de adorável. E poderoso. Existem exemplos que demonstrariam melhor essa eloqüência, mas não responderiam à pergunta. Seu snark não é apreciado, aliás.Acho que você também poderia fazer algo como:
Para formatá-lo como desejar.
BTW, originalmente pensei em usar Time.at (), mas parece que o horário de EPOCH no meu Ubuntu é Thu Jan 01:00:00 +0100 1970 e não 00:00:00 horas como eu esperava e, portanto, se o fizer:
Me dá 1 hora a mais do que o desejado.
fonte
Eu uso isso para mostrar durações de tempo em meu projeto Rails:
Adicione um método personalizado à
Integer
classe. Você pode criar um novo arquivo chamadopretty_duration.rb
nainitializers
pasta:Ligue para
seconds.pretty_duration
qualquer lugar em seu projeto:Esta resposta baseia-se no Código de Lev Lukomsky
fonte
Este usa o
divmod
método obscuro para dividir e módulo ao mesmo tempo, de modo que lida com osFloat
segundos corretamente:fonte
O uso
Time.utc.strftime
funciona apenas para valores quando o número total de horas é menor que 24 :Para valores maiores, ele retorna resultados incorretos:
Eu sugiro usar o método mais simples que encontrei para este problema:
Você sempre pode ajustar o valor retornado às suas necessidades.
fonte
Tenha cuidado com a duração superior a um dia.
fonte
Uma resposta inspirada na resposta de Lev Lukomsky tirando proveito de ActiveSupport :: Duration e lidando com milissegundos (útil para código de benchmark)
Claro que você pode estender isso facilmente com dias, meses, anos, etc, usando métodos ActiveSupport relacionados e repetindo a mesma estrutura.
Lembre-se de que para durações muito longas, isso pode ser impreciso, pois a duração de 1 mês não é fixada em número de dias, e não tenho certeza de como AS: Duration lida com isso.
fonte
Só para jogar meus 2 centavos:
Baseado na resposta de Xiao Bin.
fonte
Grite para @joshuapinter quem deu a melhor resposta (na forma de um comentário ).
Use o substituto drop-in
dotiw
gema de para obter mais controle sobre a precisão da saída para atender às diferentes necessidades:https://github.com/radar/distance_of_time_in_words
Código de visualização de amostra:
Resultando em algo assim:
fonte
ActiveSupport::Duration.build
+inspect
dá resultados válidosfonte
fonte