2017-10-26 7 views
3

3 문자 약어 형식을 사용하여 시간대를 반환하는 여러 위치에 대한 현재 시간 정보를 반환하는 서비스가 있습니다. 예 : EST, , EDT 등입니다. 그러나 어떤 ActiveSupport가 EDT 변형을 알고있는 것처럼 보이지만이를 분석 할 수없는 것 같습니다. 예 :DST의 시간대 약어 구문 분석

시간대의 전체 이름은

Time.new(2017, 12, 1).in_time_zone('Eastern Time (US & Canada)') 
=> Fri, 01 Dec 2017 00:00:00 EST -05:00 
Time.new(2017, 12, 1).in_time_zone('Eastern Time (US & Canada)').zone 
=> "EST" 
Time.new(2017, 10, 1).in_time_zone('Eastern Time (US & Canada)') 
=> Sun, 01 Oct 2017 00:00:00 EDT -04:00 
Time.new(2017, 10, 1).in_time_zone('Eastern Time (US & Canada)').zone 
=> "EDT" 

그러나 날짜에 따라 EST 또는 EDT로 변환됩니다 DST 변형의 약어 식별 할 수없는 역 :

Time.new(2017, 12, 1).in_time_zone('EST').zone 
=> "EST" 
Time.new(2017, 12, 1).in_time_zone('EST') 
=> Fri, 01 Dec 2017 00:00:00 EST -05:00 
Time.new(2017, 10, 1).in_time_zone('EDT') 
ArgumentError: Invalid Timezone: EDT 
from /home/erich/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activesupport-4.2.10/lib/active_support/core_ext/time/zones.rb:72:in `rescue in find_zone!' 

전체 이름을 그것이 날짜에 따라 DST의 상태를 올바르게 식별하기 때문에 내 경우에는 괜찮을 것입니다. 따라서 긴 형식을 파생 할 수 있다면 일년 중 언제든지 사용할 수 있습니다.

some_method('EST') 
=> "Eastern Time (US & Canada)" 
some_method('EDT') 
=> "Eastern Time (US & Canada)" 

하지 않으면, 내가 xDT 형태를 해결할 수있는 다른 방법이 : 같은 그 매핑을 제공 할 것입니다 레일 (4)에서 제공하는 방법이 있습니까?

+1

여기 혼동이 있습니다. EST와 EDT는 영역이 아니며 오프셋입니다. "동부 표준시 (미국 및 캐나다)"는 존입니다. 존에서 사용할 수있는 3 체이서 오프셋을 얻는 방법을 잘 모르겠습니다 만, 그것이 당신이 찾고있는 것입니다. – Anthony

+0

일대일 매핑이 아닙니다. 예를 들어 '동부 표준시 (미국과 캐나다)'와 '인디애나 (동부 표준시)'는 약어가 'EST'/ 'EDT'입니다. – Stefan

+0

@Anthony 필자는 분명히 틀릴 수도 있지만 "오프셋"이라고하는 비 숫자 값을 본 적이 없습니다. 그럴 경우 Activesupport의 혼란이 깊어집니다. '.zone'은 예를 들어 ''EST'' (동부 표준시),'gmt_offset','utc_offset','formatted_offset'이 리턴합니다 ... 잘, 오프셋. ;) – erich2k8

답변

0

편리할만한 TimezoneParser gem이 있습니까?

+0

필자는 항상 한 명의 커미터와 프로덕션 코드에서 낮은 채택률을 가진 보석을 사용하는 것을 주저하지만, 체크 아웃하겠습니다. 추천 해 주셔서 감사합니다. – erich2k8