2016-09-15 60 views
0
> input = "12/31/2015 23:59" 
> format = "%m/%d/%Y %H:%M" 
> Time.zone = "US/Eastern" 
> Time.zone.utc_offset 
=> -18000 

> Time.strptime(input, format) 
=> 2015-12-31 23:59:00 +0100 

> DateTime.strptime(input, format) 
=> Thu, 31 Dec 2015 23:59:00 +0000 

而我想2015-12-31 23:59:00 -0500如何按照正確的時區

正如你可以看到strptime的兩個版本忽略配置的時區(一個使用UTC和一個使用系統解析日期和時間自定義格式/機器時區)。

如何在Time.zone解析自定義格式的給定輸入?

回答

0

一個解決辦法是,以解析的時間轉換成ISO字符串,帶不正確時區信息,並再次解析,使用Time.zone.parse這次它採用Time.zone:

> parsed = Time.strptime(input, "%m/%d/%Y %H:%M") 
> Time.zone.parse(parsed.to_s.gsub(/\+\d\d:?\d\d/, "")) 
=> 2015-12-31 23:59:00 -0500 

一個解決辦法是要解析的時間轉換成ISO串,剝離不正確的時區信息,並再次解析,使用Time.zone.parse這次它採用Time.zone:

> parsed = Time.strptime(input, "%m/%d/%Y %H:%M") 
> Time.zone.parse(parsed.to_s.gsub(/\+\d\d:?\d\d/, "")) 
=> 2015-12-31 23:59:00 -0500 

也有可能到時區追加到輸入(和格式):

> DateTime.strptime(input + Time.zone.name, format + " %Z") 
=> Thu, 31 Dec 2015 23:59:00 -0500 

這兩個解決方案看起來都像是一個黑客,我希望更優雅。