Ruby에서 UTC 타임 스탬프를 ISO 8601로 변환


85

UTC로 된 타임 스탬프가 있습니다.

'2010-10-25 23:48:46 UTC'

ISO 8601로 변환해야합니다.

'2010-10-29 06 : 09Z'

문서는 지옥처럼 혼란 스럽습니다. 가장 쉬운 방법은 무엇입니까?

답변:


185

우리를 속이려는 것 같아요.

질문에 대한 입력 날짜는 2010 년 10 월 25 일이고 출력은 2010 년 10 월 29 일 입니다 . 잘 했어요!

이 nit-picking 스레드에서 계속 : 시간도 완전히 다르며 출력 시간에서 초를 놓치고 있습니다.

이제 진정한 답입니다.

먼저 약간의 사실을 알 수 있습니다. Ruby의 ISO 8601 출력은 ISO 8601의 Wikipedia 페이지 의 "Combined date and time"출력과 유사 합니다 .

문자열이 있으므로 Time.NET으로 할 수 있는 객체 로 변환해야합니다 to_time. 그런 다음 iso8601ISO 8601 버전을 가져 오기 위해 해당 객체를 호출하기 만하면됩니다 .

"2010-10-25 23:48:46 UTC".to_time.iso8601

to_time방법은 Rails에서 제공하는 반면 iso8601Ruby의 표준 라이브러리에서는 제공합니다.


7
좋은 대답 이었지만 첫 번째 부분을 얻지 못했습니다 (유머로되어 있었나요?)
Mark Thomas

5
제길! 당신은 당신을 속이기 위해 내 음모를 보았습니다. = P 훌륭한 답변에 감사드립니다. 왜 그들이 문서에 그것을 쓰지 않는지 궁금합니다!
ming yeow 2010 년

13
@ 마크 토마스 : 네, 유머라고 생각했습니다. 그는 결코 일치하지 않는 입력 및 출력 시간을 제공했습니다. 트릭시 리틀 호빗!
Ryan Bigg

이것은 작동하지만 그의 질문은 루비에서 어떻게하는지 물었지만 레일 환경에 있다고 가정하지 않았습니다.
courtsimas

1
관련, 'to_time'~ Time.now.iso8601 형식 (예 : '2010-10-25T23 : 48 : 46Z')을 지정해 주셔서 감사합니다. 'Z'대신 '+00 : 00'을 사용하려면 레거시 시스템의 경우) Time.now.to_time.iso8601이이를 수행하는 것으로 보입니다.
lucygenik

21

많은 실험 끝에 Time 라이브러리의 파서가 DateTime보다 낫다는 것을 알았습니다. 그 경고와 함께, 나는 항상 이런 종류의 일에 DateTime보다는 Time을 사용하고, 루비 문서는 이것이 왜 그런지 알아보기 어렵습니다.

require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"

5
좋은 순수 루비 솔루션. 추가하고 싶을 때, 원래 시간이 UTC가 아닌 경우 다음을 원할 수 있습니다. Time.parse("...").utc.iso8601, otherwize 시간이 추가 +03:00되거나 원래 시간 문자열이 제공된 시간대에 따라 다른 값이 추가됩니다. 대신 Z.
akostadinov

4

참고 : to_time 메소드를 적용하기 전에 시간 문자열을 시간 객체로 변환 (분석)해야합니다.

ruby-1.9.2-p180 :016 > "2010-10-25 23:48:46 UTC".to_time.iso8601
NoMethodError: undefined method `to_time' for "2010-10-25 23:48:46 UTC":String
    from (irb):16

올바른 절차 :

irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")

irb> ut.iso8601
 => "2010-10-25T23:48:46+00:00" 

1

Rails를 사용하는 경우 여기에있는 다른 답변이 지시하는 방식으로 변환 / 파싱 할 필요가 없기 때문에이 매우 오래된 질문에 대한 답변을 추가합니다.

  • 이미 타임 스탬프 (예 : created_at또는 updated_at속성) 인 경우 해당 타임 스탬프 에서 메서드를 직접 호출 할 수 있습니다iso8601 (예 :) object.created_at.iso8601.
  • iso8601메서드는 소수 자릿수를 표시하는 숫자 인수도받습니다. 2020-04-06T19:16:55.604Z대신 원하는 경우 이것을 사용합니다 2020-04-06T19:16:55Z.

https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.