條件:目前中國大陸是單一時區,因此 Mapping 到的時區一定都要是 GMT+08:00。
情境如下:
在 app/calculators/timezone_calculator.rb 檔案裡:SINGLE_TIMEZONE_COUNTRIES = %w[NL CZ DE SG HK TW CN KR GB NZ TH IT VN MY JP].freeze
CN 國碼,一定要放進去 SINGLE_TIMEZONE_COUNTRIES 這個變數裡。
之後經過 initialize
初始化完,進入到定義的 perform
方法裡:
def perform
return timezone_by_country_code if single_timezone?
finders.each do |klass|
timezone = klass.new(@params).perform
return timezone if timezone.present?
end
return if @default == false
@default || DEFAULT_TIMEZONE
end
由於是單一時區,剛好符合第一個條件 return timezone_by_country_code if single_timezone?
在 return timezone_by_country_code if single_timezone?
這兩個方法,是我們另外宣告的方法,方別為:
def timezone_by_country_code
ActiveSupport::TimeZone
.country_zones(@params[:country_code])
.first
.tzinfo
.name
end
因為 if single_timezone?
方法回傳為 true,便會執行 timezone_by_country_code
這個方法,經過gem 'pry-remote'
跟 gem 'pry-nav'
這兩個查 Bug 套件檢查:
經過了 timezone_by_country_code
這個方法裡面寫好的程式碼去執行,這裡會得到 Urumqi (中國/烏魯木齊)。
def single_timezone?
return if @params[:country_code].blank?
SINGLE_TIMEZONE_COUNTRIES.include?(@params[:country_code])
end
這個方法是呼應上面指定 SINGLE_TIMEZONE_COUNTRIES
變數,是否有含單一時區的國碼,這裡回傳是 true,此次範例為國碼 CN。
碰到的問題:
透過以上的程式執行,Timezone 會 Mapping 到一個 "Urumqi": "(GMT+06:00) Asia/Urumqi"
,但這並不是我們要的,因為所呈現的是 GMT+06:00 的時區中國/烏魯木齊。
針對上述問題,所想到的解決方案:
SINGLE_TIMEZONE_COUNTRIES = %w[NL CZ DE SG HK TW CN KR GB NZ TH IT VN MY JP].freeze
抽掉,但是目前條件是中國大陸要為單一時區,因此這方法不可行。"Urumqi": "(GMT+06:00) Asia/Urumqi"
直接改成 GMT+08:00,但是這感覺是存粹在 UI 上改,不曉得這方法是否可行 !? 在今日 10/18 10:20 驗證第二點是否可行,答案是不可行,透過 rails c
去檢查存進去的值,就算已改成 GMT+08:00 時區,但跟 local 時間比較的話,只有 6 小時的誤差,正確應為 8 小時誤差才對。timezone_by_country_code
這個方法裡,判斷 @params[:country_code]
如果是 CN 的話,就把 .first
方法修改為 .last
,讓它去吃第二個城市為上海 GMT+08:00 時區