2017-12-05 1 views
-1

erhalte ich eine Zahl, das Datum von einem Back-End, und ich versuche, es zu einem Datum auf diese Weise zu konvertieren:Konvertieren Anzahl bisher in Ruby

number = item["created"].to_i 
number #=> 1512387277084 
DateTime.strptime(number.to_s ,'%s') #=> 49895-08-24T08:58:04+00:00 
Time.at(number).utC#=> 49895-08-24 08:58:04 UTC 
Time.at(number) #=> 49895-08-24 11:58:04 +0300 

Aber das ist ein falsche Ergebnis.

Wenn ich Epoch verwenden & Unix Timestamp Conversion Tools, erhalte ich dieses Ergebnis:

1512387277084 
Assuming that this timestamp is in milliseconds: 
GMT: Monday, December 4, 2017 11:34:37.084 AM 
Your time zone: Monday, December 4, 2017 2:34:37.084 PM GMT+03:00 

Time.at(number) funktioniert nicht.

Wie konvertiert man es richtig?

Antwort

3
DateTime.strptime('1512387277084', '%Q') 
#⇒ #<DateTime: 2017-12-04T11:34:37+00:00 
#  ((2458092j,41677s,84000000n),+0s,2299161j)> 

DateTime formatting.

+2

'Time.strptime' arbeitet, auch in Ordnung. – Stefan

0

Nach the ruby documentation nimmt die at Methode, der Time Klasse, als Argument "die Anzahl der Sekunden" seit der Epoche nicht die "Millisekunden" seit der Epoche. Eine andere Variante nimmt als Argumente die "Sekunden" seit der Epoche und "Mikrosekunden mit Frac".

Sie müssen von ms zu sec und usnumber (der Eingang) konvertieren die erwartete/korrekte Ergebnis zu erhalten.

Beispiele

Wrong (ms als interpeted Sekunden):

> number = 1512387277084 # ms since epoch 
=> 1512387277084 
> Time.at(number) 
=> 49895-08-24 10:58:04 +0200 

Sekunden mit fraktalen:

> number2 = number/1000.0 
=> 1512387277.084 
> Time.at(number2) 
=> 2017-12-04 12:34:37 +0100 
> Time.at(number2).usec 
=> 84000 
> Time.at(number2).nsec 
=> 84000110 # Wrong of by 110 ns 

> Time.at(number2.round(3)).nsec 
=> 84000110 # Wrong of by 110 ns 
> Time.at(number2.round(2)).usec 
=> 79999 # Wrong 
> Time.at(number2.round(2)).nsec 
=> 79999923 # Wrong 

Sekunden only:

> number3 = number/1000 
=> 1512387277 
> Time.at(number3) 
=> 2017-12-04 12:34:37 +0100 
> Time.at(number3).usec 
=> 0 # Wrong 
> Time.at(number3).nsec 
=> 0 # Wrong 

Sekunden und Mikro:

ms = number % 1000 # Milliseconds 
=> 84 
> us = ms * 1000 # Microseconds 
=> 84000 
> Time.at(number3, us) 
=> 2017-12-04 12:34:37 +0100 
> Time.at(number3, us).usec 
=> 84000 # OK 
> Time.at(number3, us).nsec 
=> 84000000 # OK 
> Time.at(number3, us).to_f 
=> 1512387277.084 # OK 

aktualisieren 2

Sekunden als Rational

> number4 = number.quo(1000) 
=> (378096819271/250) 
> Time.at(number4) 
=> 2017-12-04 12:34:37 +0100 
> Time.at(number4).usec 
=> 84000 # OK 
> Time.at(number4).nsec 
=> 84000000 # OK 
> Time.at(number4).to_f 
=> 1512387277.084 # OK 
+0

Sie müssen 'number' durch 1000 dividieren, um' Time.at' zu verwenden, aber bei der Gleitkommadivision wird ** nicht ** das korrekte Ergebnis liefern: 'Time.at (number2) .nsec' gibt' 84000110 zurück '. Das korrekte Ergebnis wäre '84000000' - deins ist 110 Nanosekunden aus. – Stefan

+0

@Stefan hat meine Antwort aktualisiert, um Ihre Eingaben zu berücksichtigen. Danke. – Tungdil

+1

Muss nicht so kompliziert sein: 'Time.at (number.quo (1000))' – Stefan