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
. 그런 다음 iso8601
ISO 8601 버전을 가져 오기 위해 해당 객체를 호출하기 만하면됩니다 .
"2010-10-25 23:48:46 UTC".to_time.iso8601
이 to_time
방법은 Rails에서 제공하는 반면 iso8601
Ruby의 표준 라이브러리에서는 제공합니다.
답변
많은 실험 끝에 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