[ruby-on-rails] Ruby에서 UTC 타임 스탬프를 ISO 8601로 변환

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

‘2010-10-25 23:48:46 UTC’

ISO 8601로 변환해야합니다.

‘2010-10-29 06 : 09Z’

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



답변

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

질문에 대한 입력 날짜는 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의 표준 라이브러리에서는 제공합니다.


답변

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

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


답변

참고 : 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"


답변

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


답변