programing

유닉스 타임스탬프(에포크 이후 초)를 루비 날짜 시간으로 변환하는 방법은 무엇입니까?

powerit 2023. 6. 2. 21:23
반응형

유닉스 타임스탬프(에포크 이후 초)를 루비 날짜 시간으로 변환하는 방법은 무엇입니까?

유닉스 타임스탬프(에포크 이후 초)를 루비 날짜 시간으로 어떻게 변환합니까?

죄송합니다. 시냅스 실패의 짧은 순간입니다.진짜 답은 이렇습니다.

require 'date'

Time.at(seconds_since_epoch_integer).to_datetime

간단한 예(현재 시스템 표준 시간대를 고려함):

$ date +%s
1318996912

$ irb

ruby-1.9.2-p180 :001 > require 'date'
 => true 

ruby-1.9.2-p180 :002 > Time.at(1318996912).to_datetime
 => #<DateTime: 2011-10-18T23:01:52-05:00 (13261609807/5400,-5/24,2299161)> 

추가 업데이트(UTC용):

ruby-1.9.2-p180 :003 > Time.at(1318996912).utc.to_datetime
 => #<DateTime: 2011-10-19T04:01:52+00:00 (13261609807/5400,0/1,2299161)>

최근 업데이트:1~2주 전에 HA 서비스 작업을 하면서 이 스레드의 상위 솔루션을 벤치마킹했는데, 다음과 같은 사실을 알고 놀랐습니다.Time.at(..)능가하는DateTime.strptime(..)(업데이트: 벤치마크 추가).

# ~ % ruby -v
#  => ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin13.0]

irb(main):038:0> Benchmark.measure do
irb(main):039:1*   ["1318996912", "1318496912"].each do |s|
irb(main):040:2*     DateTime.strptime(s, '%s')
irb(main):041:2>   end
irb(main):042:1> end

=> #<Benchmark ... @real=2.9e-05 ... @total=0.0>

irb(main):044:0> Benchmark.measure do
irb(main):045:1>   [1318996912, 1318496912].each do |i|
irb(main):046:2>     DateTime.strptime(i.to_s, '%s')
irb(main):047:2>   end
irb(main):048:1> end

=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>

irb(main):050:0* Benchmark.measure do
irb(main):051:1*   ["1318996912", "1318496912"].each do |s|
irb(main):052:2*     Time.at(s.to_i).to_datetime
irb(main):053:2>   end
irb(main):054:1> end

=> #<Benchmark ... @real=1.5e-05 ... @total=0.0>

irb(main):056:0* Benchmark.measure do
irb(main):057:1*   [1318996912, 1318496912].each do |i|
irb(main):058:2*     Time.at(i).to_datetime
irb(main):059:2>   end
irb(main):060:1> end

=> #<Benchmark ... @real=2.0e-05 ... @total=0.0>

DateTime.strptimeepoch 이후의 초를 처리할 수 있습니다.숫자를 문자열로 변환해야 합니다.

require 'date'
DateTime.strptime("1318996912",'%s')

표준 시간대 처리

비록 이것이 언급되었지만, 미래의 사람들이 이 매우 중요한 차이를 놓치지 않도록 저는 분명히 하고 싶습니다.

DateTime.strptime("1318996912",'%s') # => Wed, 19 Oct 2011 04:01:52 +0000

UTC로 반환 값을 표시하고 초를 String으로 지정해야 하며 UTC Time 개체를 출력합니다.

Time.at(1318996912) # => 2011-10-19 00:01:52 -0400

반환 값을 LOCAL 시간대에 표시합니다. 일반적으로 FixNum 인수가 필요하지만 시간 개체 자체는 표시되지 않더라도 UTC에 있습니다.

그래서 두 방법 모두에 동일한 정수를 전달했지만, 수업 방식 때문에 겉보기에 두 가지 다른 결과가 나왔습니다.#to_s메소드가 작동합니다.하지만, @Eero가 제게 두 번 상기시켜줘야 했던 것처럼:

Time.at(1318996912) == DateTime.strptime("1318996912",'%s') # => true

두 반환 값의 동일성 비교는 여전히 true를 반환합니다.다시 말하지만, 이것은 값들이 기본적으로 같기 때문입니다 (비록 다른 클래스들이지만,#==방법은 이것을 처리합니다), 하지만.#to_s메소드는 매우 다른 문자열을 인쇄합니다.비록 우리가 끈을 보면, 우리는 그것들이 실제로 같은 시간이고, 단지 다른 시간대에 인쇄된다는 것을 알 수 있습니다.

메서드 인수 설명

문서에는 "숫자 인수가 제공되면 결과는 현지 시간으로 표시됩니다.일리는 있지만, 문서에서 비폭력 주장의 예를 제시하지 않기 때문에 저에게는 약간 혼란스러웠습니다.정수가 아닌 일부 인수의 경우:

Time.at("1318996912")
TypeError: can't convert String into an exact number

String 인수를 사용할 수는 없지만 Time 인수를 사용하여Time.at그러면 인수의 시간대에 결과가 반환됩니다.

Time.at(Time.new(2007,11,1,15,25,0, "+09:00"))
=> 2007-11-01 15:25:00 +0900

벤치마크

@Adam Eberlin과 그의 답변에 대해 논의한 후, 저는 모든 것을 가능한 한 평등하게 만들기 위해 약간 변경된 벤치마크를 발표하기로 결정했습니다.또한, 저는 이것들을 다시 짓고 싶지 않습니다. 그래서 이곳은 그것들을 구하기에 가장 좋은 장소입니다.

Time.at (int).to_datetime ~ 2.8배 빠른 속도

09:10:58-watsw018:~$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
09:11:00-watsw018:~$ irb
irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> require 'date'
=> true
irb(main):003:0>
irb(main):004:0* format = '%s'
=> "%s"
irb(main):005:0> times = ['1318996912', '1318496913']
=> ["1318996912", "1318496913"]
irb(main):006:0> int_times = times.map(&:to_i)
=> [1318996912, 1318496913]
irb(main):007:0>
irb(main):008:0* datetime_from_strptime = DateTime.strptime(times.first, format)
=> #<DateTime: 2011-10-19T04:01:52+00:00 ((2455854j,14512s,0n),+0s,2299161j)>
irb(main):009:0> datetime_from_time = Time.at(int_times.first).to_datetime
=> #<DateTime: 2011-10-19T00:01:52-04:00 ((2455854j,14512s,0n),-14400s,2299161j)>
irb(main):010:0>
irb(main):011:0* datetime_from_strptime === datetime_from_time
=> true
irb(main):012:0>
irb(main):013:0* Benchmark.measure do
irb(main):014:1*   100_000.times {
irb(main):015:2*     times.each do |i|
irb(main):016:3*       DateTime.strptime(i, format)
irb(main):017:3>     end
irb(main):018:2>   }
irb(main):019:1> end
=> #<Benchmark::Tms:0x00007fbdc18f0d28 @label="", @real=0.8680500000045868, @cstime=0.0, @cutime=0.0, @stime=0.009999999999999998, @utime=0.86, @total=0.87>
irb(main):020:0>
irb(main):021:0* Benchmark.measure do
irb(main):022:1*   100_000.times {
irb(main):023:2*     int_times.each do |i|
irb(main):024:3*       Time.at(i).to_datetime
irb(main):025:3>     end
irb(main):026:2>   }
irb(main):027:1> end
=> #<Benchmark::Tms:0x00007fbdc3108be0 @label="", @real=0.33059399999910966, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.32000000000000006, @total=0.32000000000000006>

모든 면에서 완전히 그리고 완전히 틀리지는 않을 것입니다.

****벤치마크 추가***

날짜 시간을 유닉스 형식으로 변환한 다음 문자열로 변환하는 명령 하나

    DateTime.strptime(Time.now.utc.to_i.to_s,'%s').strftime("%d %m %y")

    Time.now.utc.to_i #Converts time from Unix format
    DateTime.strptime(Time.now.utc.to_i.to_s,'%s') #Converts date and time from unix format to DateTime

마지막으로 strft 시간은 날짜를 포맷하는 데 사용됩니다.

예:

    irb(main):034:0> DateTime.strptime("1410321600",'%s').strftime("%d %m %y")
    "10 09 14"

코드를 실행한 이후의 시간(초)을 알려줍니다.

time = Time.new + 1000000000 #date in 1 billion seconds

풋(시간)

현재 시간에 따라 출력되는 질문에 답합니다.047-05-14 05:16:16 +0000초10억 초 후)

또는 특정 시간에서 10억 초를 카운트하려면 형식입니다.Time.mktime(year, month,date,hours,minutes)

time = Time.mktime(1987,8,18,6,45) + 1000000000

puts("나는 10억 초가 될 것이다: "+time")

만약 당신이 단지 데이트를 원했다면, 당신은 할 수 있습니다.Date.strptime(invoice.date.to_s, '%s')invoice.date의 형태로 나옵니다.Fixnum그리고 나서 a로 변환됩니다.String.

언급URL : https://stackoverflow.com/questions/7816365/how-to-convert-a-unix-timestamp-seconds-since-epoch-to-ruby-datetime

반응형