Shim Won

January 9, 2015 8:10 am

번역 Ruby 2.2.0 Time#parse TZ관련 회귀

원문 : https://byparker.com/blog/2014/ruby-2-2-0-time-parse-localtime-regression/

Jekyll에 루비 2.2를 지원하는 작업을 하다 timezone 옵션 설정에 관한 테스트가 겉보기로는 알 수 없게 실패하는 것을 발견했습니다. 몇가지 TZ 변수가 다르게 해석되고 있었나 판단하기 위해 루비의 소스코드와 변경로그를 뒤지졌지만, 이 변경에 대한 명시적인 참조를 찾을 수 없었습니다. 저는 Jekyll이 어떻게 IRB에서 Time#parse를 사용하는지 확인해봤고, 2.2에서 꽤나 주요(major)해보이는 변경을 발견했습니다.

루비 2.1 에서 타임존은 자동으로 로컬 시간(TZ 환경 변수로 설정)으로 변경되었습니다.

>> require 'time'
=> true
>> ENV['TZ'] = 'Australia/Melbourne'
=> "Australia/Melbourne"
>> Time.parse("2014-12-29 20:16:32 -0400")
=> 2014-12-30 11:16:32 +1100

하지만 루비 2.2에서는 그렇지 않습니다.

>> require 'time'
=> true
>> ENV['TZ'] = 'Australia/Melbourne'
=> "Australia/Melbourne"
>> Time.parse("2014-12-29 20:16:32 -0400")
=> 2014-12-29 20:16:32 -0400 # <== !!! Timezone remains unchanged.
>> Time.parse("2014-12-29 20:16:32 -0400").localtime
=> 2014-12-30 11:16:32 +1100

젬 업데이트하세요! 어플리케이션 업데이트하세요! Time#parse를 사용하거나 시스템 타임존이 우선되어야 하는 경우는 전부 #localtime 콜을 붙이세요.

…는 개뿔.^1

노부^2 는 여태까지 설명한 이슈를 리젝하고, 이 수정을 버그 픽스라고 했습니다. 아… 그래요. 저한테는 이상해보이지만, 의도하지 않는 결과를 낼 가능성이 있을 수도 있다고 볼수도 있겠네요. 저는 이에 관한 설명과 패치가 포함된 이슈의 링크를 요청했고 아키라^3 가 그런건 없지만 다른 버그에 영감을 얻어 수정했다고 대답했습니다.

그래서, 그리고 내 루비 인생에서 가장 엉망인 경험을 하게 되었습니다. 아키라가 참조한 이슈 #9794는 Felipe Contreras라는 분의 버그 리포트였습니다. 내용은 #strptime 메서드에 TimeDateTime의 차이에 대해 논의하고 있었습니다. Time.strptime”%s %z”을 넘길 때 타임존을 해석하지만, DateTime.strptime는 그렇지 않다고 합니다. 저는 이 곤경을 설명해 줄 리비전을 찾기 위해 대부분은 일본어인 댓글을 통독했습니다.(해석에 많은 도움이 되진 않았지만 구글 번역에 감사를)

댓글 중 하나가 이슈 #7445를 참조했고, 이는 기본적으로 #9794과 동일한 내용이었습니다. 음… 이상한데. 이 이슈 #7445는 2년전에 Felipe가 제기한 것으로 타다요시에게 자신의 관점을 관철시키지 못해, 타다요시가 리젝하고 넘어간 것으로 되어있었습니다. Felipe는 알기쉽게도 이에 좌절했습니다. 그는 일년 반후에 이 논의를 #9794로 계속 했고, 메일링 리스트에서도 논의 되었습니다. 결국, 마츠가 개입해 이것을 “기능”이라 불렀고, 타다요시가 이 행동을 R45822를 작성했습니다. 그는 불필요하게 점잖은 커밋 메세지를 작성했습니다.

strptime의 새로운 기능(버그픽스 아님). 주어진 데이터가 로컬 시간이 아니면 오프셋 적용(%s, %Q). 이것은 예외적인 기능이고 사용하는 것을 추천하지 않습니다. git 커뮤니티에 감사드립니다.

와우. 타다요시도 무례하고 Felipe도 무례하고 공통의 언어를 찾는 노력은 눈꼽만큼도 없었습니다. 각각 Felipe의 영어로 다른사람들은 일어로 댓글을 달았습니다. 타다요시는 Felipe의 영어로 해달라는 요청을 무시했습니다. Felipe는 공용어인 영어를 사용해야하는 “국제 프로젝트”로서는 있을 수 없게도 국경에 밖에 있다는 이유만으로 일본인들에게 무시되었습니다.^4

그래서 내 문제는 커뮤니케이션 장벽, 일관성없음에 대한 강렬한 불만과 이를 볼 수있는 능력의 명백한 부족에서 발생한 것 같습니다. 그 결과 루비의 주요하지않은(MINOR) 버전 사이에 (SemVer에 위배되는) 동작이 변하는 변경이 일어나게 되었습니다. 에휴.

1 : 원문은 Tangent. 2 : 루비 코어팀의 풀타임 루비 개발자로 주로 버그 픽스 담당입니다. 3 : 루비, 레일즈 코어팀. 카미나리의 오너이기도 합니다. 4 : 제가 과장한 거 아닙니다. 원문이 이래요. Felipe dismissed Japanese as unacceptable for an “international project”, assuming it must use the Lingua franca of English just because it crosses nation-state borders.