Como obter o carimbo de data / hora UTC em Ruby?


Respostas:


117
time = Time.now.getutc

Fundamentação: meus olhos, um carimbo de data e hora é exatamente isso: um ponto no tempo. Isso pode ser representado com precisão com um objeto. Se você precisar de mais alguma coisa, um valor escalar, por exemplo, segundos desde a época do Unix, intervalos de 100 ns desde 1601 ou talvez uma string para fins de exibição ou armazenamento do registro de data e hora em um banco de dados, você pode facilmente obtê-lo do objeto. Mas isso depende muito do uso pretendido.

Dizer que "um verdadeiro carimbo de data e hora é o número de segundos desde a época do Unix" está um pouco esquecido, pois essa é uma maneira de representar um ponto no tempo, mas também precisa de informações adicionais para saber que você está lidando com isso. um tempo e não um número. Um Timeobjeto resolve esse problema perfeitamente, representando um ponto no tempo e também sendo explícito sobre o que é .


93
Isso fornece o objeto time, você deve usar o Time.now.to_i para obter um carimbo de data
#

3
Na minha opinião, um objeto é timestampy o suficiente e você ainda tem toda a liberdade que precisa. Reduzi-lo a um valor escalar na maioria dos casos não é realmente necessário.
Joey

2
Os registros de data e hora são relativos à época - não importa em que fuso horário você está. A resposta de manzhikov é a melhor.
31512 Ryan Mohr

2
Embora seja uma boa explicação de por que não usar um carimbo de data / hora unix, isso não responde à pergunta do OP (nem a mesma pergunta que eu tinha quando encontrei este post). Os carimbos de data e hora do Unix são necessários em muitos casos (por exemplo, para APIs). Mesmo após a explicação, essa resposta não forneceu o caminho real para obter o carimbo de data / hora.
stuckj

5
@stuckj, em nenhum momento a pergunta menciona um carimbo de data e hora do Unix. Eu apenas continuo com votos negativos para esta resposta, porque as pessoas parecem pensar que »timestamp == Unix time«, daí a explicação.
Joey

246

Você poderia usar: Time.now.to_i.


1
Faria mais sentido fazer Time.now.getutc.to_i? Ou isso é essencialmente equivalente?
stuckj

20
o carimbo de data e hora é o mesmo em todos os fusos horários. :)
manzhikov

2
Oh sim, duh. Pergunta Brainfart. :)
stuckj

esta é a resposta mais apropriada!
Darlan Dieterich

46

A formatação padrão não é muito útil, na minha opinião. Prefiro a ISO8601, pois é selecionável, relativamente compacta e amplamente reconhecida:

>> require 'time'
=> true
>> Time.now.utc.iso8601
=> "2011-07-28T23:14:04Z"

1
Observe que esse método vem do ActiveSupport, não da biblioteca padrão rubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
n0nick

3
@ n0nick você tem certeza, mesmo na versão 2.0? Eu sei que eu usei-o em instalações "vanilla" sem trilhos etc., e é no /usr/share/ruby/2.0/time.rb.
Tim Sylvester #

15

Geralmente, o timestamp não tem fuso horário.

% irb
> Time.now.to_i == Time.now.getutc.to_i
=> true

1
to_fserá melhor
xis 08/04

1
depende da situação.
Yuki Matsukura

1
Quando é que um timestamp ter um fuso horário?
Dennis

1
o registro de data e hora não está relacionado ao fuso horário. Em outras palavras, o registro de data e hora é UTC.
precisa

1
@YukiMatsukura Na verdade, isso também não é totalmente preciso. Um carimbo de data / hora nem representa qualquer fuso horário, portanto, "o carimbo de data / hora é UTC" é verdadeiro tanto quanto "o carimbo de data / hora é cocô de elefante". O problema está na representação. A maioria dos desenvolvedores o representa como carimbo de data e hora do Unix (que não indica UTC ou qualquer outro fuso horário, pois é apenas um valor inteiro).
O Pellmeister

10

se você precisar de um carimbo de data / hora legível por humanos (como a migração de trilhos) ex. " 20190527141340 "

Time.now.utc.to_formatted_s(:number)  # using Rails

Time.now.utc.strftime("%Y%m%d%H%M%S") # using Ruby

7

Qual a vantagem de um registro de data e hora com sua granularidade em segundos? Acho muito mais prático trabalhar com isso Time.now.to_f. Heck, você pode até jogar um to_s.sub('.','')para se livrar do ponto decimal, ou realizar uma typecast como este: Integer(1e6*Time.now.to_f).


obrigado. Eu usei isso: Integer(1e3*Time.now.to_f)para que meu lado do servidor rubi timestamp era o mesmo que o javascript do lado do clienteDate.now()
joshweir


-2

time = Time.zone.now()

Funcionará como

irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC

Jonathan, você pode me dizer o que há de errado nesta resposta?
Asterisk

1
Isso depende do que Ruby está no fuso horário local. Funcionará como esperado somente se o TZ local for UTC.
MasterCheffinator

-6

A maneira correta é fazer um Time.now.getutc.to_ipara obter a quantidade correta de carimbo de data / hora, pois simplesmente exibir o número inteiro nem sempre precisa ser igual ao carimbo de data / hora utc devido a diferenças de fuso horário.


7
Todos os outros disseram isso, então por que copiá-lo, sem novas informações, três anos atrasado?
Kaspar Lee

2
E sem pontuação que tornaria a sentença 1, que é um pouco longa demais e não é completamente sintaticamente correta, mais clara.
Emile Vrijdags
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.