2015-06-15 21 views
2

我正在写与Yammer的整合,它返回一个时区字符串,看起来像这样:如何在JVM上解析时区字符串“Pacific Time(US&Canada)”?

Pacific Time (US & Canada) 

一个人如何解析成在JVM上一个TimeZone或DateTimeZone呢?我试过TimeZone.getTimeZoneDateTimeZone.forID,但无济于事。

+0

它是“太平洋标准时间”吗?我认为,它是“-8”,“(GMT -08:00)太平洋时间(美国和加拿大),提华纳”。请尝试。 –

+0

@ bobs_007:我需要以一般方式做到这一点。查找一个特定的我没有问题。 – cdmckay

+0

“太平洋时间(美国和加拿大)”只是包含Windows区域名称的CLDR文件中的注释,代表“太平洋标准时间”。 Joda-Time也无法读取原始的Windows区域名称。要么你必须使用Joda-Time-interface'DateTimeParser'编写专门的解析器,要么使用另一个至少能够理解windows区域名称的库(在用“Pacific Standard Time”替换了所提到的字符串之后)。请记住,了解Windows区域名称通常也需要区域设置。 –

回答

4

看来Yammer会在其REST API中返回一个timezone字段作为user对象的一部分。一个例子可以被看作是在标有“C.应用鉴权”的一节中的响应身体的一部分the authorization docs,看起来像:

{ 
    "user": 
    { 
    "timezone": "Hawaii", 
    "interests": null, 
    "type": "user", 

... 

这也从任何GET /users/... APIs的返回。从实验,我可以看到,通过API返回的值对应于出现在用户帐户设置屏幕的下拉列表中的键(在https://yammer.com/<your domain>/account/display_options找到):

screenshot

当您查看这个网页的源,你可以看到下拉列表中的所有键和值:

<select id="meta_user_timezone" name="meta_user[timezone]"><option value="Hawaii">(GMT-10:00) Hawaii</option> 
<option value="Alaska">(GMT-09:00) Alaska</option> 
<option value="Pacific Time (US &amp; Canada)" selected="selected">(GMT-08:00) Pacific Time (US &amp; Canada)</option> 
<option value="Arizona">(GMT-07:00) Arizona</option> 
<option value="Mountain Time (US &amp; Canada)">(GMT-07:00) Mountain Time (US &amp; Canada)</option> 
<option value="Central Time (US &amp; Canada)">(GMT-06:00) Central Time (US &amp; Canada)</option> 
<option value="Eastern Time (US &amp; Canada)">(GMT-05:00) Eastern Time (US &amp; Canada)</option> 
<option value="Indiana (East)">(GMT-05:00) Indiana (East)</option><option value="" disabled="disabled">-------------</option> 
<option value="American Samoa">(GMT-11:00) American Samoa</option> 
<option value="International Date Line West">(GMT-11:00) International Date Line West</option> 
<option value="Midway Island">(GMT-11:00) Midway Island</option> 
<option value="Tijuana">(GMT-08:00) Tijuana</option> 
<option value="Chihuahua">(GMT-07:00) Chihuahua</option> 
<option value="Mazatlan">(GMT-07:00) Mazatlan</option> 
<option value="Central America">(GMT-06:00) Central America</option> 
<option value="Guadalajara">(GMT-06:00) Guadalajara</option> 
<option value="Mexico City">(GMT-06:00) Mexico City</option> 
<option value="Monterrey">(GMT-06:00) Monterrey</option> 
<option value="Saskatchewan">(GMT-06:00) Saskatchewan</option> 
<option value="Bogota">(GMT-05:00) Bogota</option> 
<option value="Lima">(GMT-05:00) Lima</option> 
<option value="Quito">(GMT-05:00) Quito</option> 
<option value="Caracas">(GMT-04:30) Caracas</option> 
<option value="Atlantic Time (Canada)">(GMT-04:00) Atlantic Time (Canada)</option> 
<option value="Georgetown">(GMT-04:00) Georgetown</option> 
<option value="La Paz">(GMT-04:00) La Paz</option> 
<option value="Newfoundland">(GMT-03:30) Newfoundland</option> 
<option value="Brasilia">(GMT-03:00) Brasilia</option> 
<option value="Buenos Aires">(GMT-03:00) Buenos Aires</option> 
<option value="Greenland">(GMT-03:00) Greenland</option> 
<option value="Santiago">(GMT-03:00) Santiago</option> 
<option value="Mid-Atlantic">(GMT-02:00) Mid-Atlantic</option> 
<option value="Azores">(GMT-01:00) Azores</option> 
<option value="Cape Verde Is.">(GMT-01:00) Cape Verde Is.</option> 
<option value="Casablanca">(GMT+00:00) Casablanca</option> 
<option value="Dublin">(GMT+00:00) Dublin</option> 
<option value="Edinburgh">(GMT+00:00) Edinburgh</option> 
<option value="Lisbon">(GMT+00:00) Lisbon</option> 
<option value="London">(GMT+00:00) London</option> 
<option value="Monrovia">(GMT+00:00) Monrovia</option> 
<option value="UTC">(GMT+00:00) UTC</option> 
<option value="Amsterdam">(GMT+01:00) Amsterdam</option> 
<option value="Belgrade">(GMT+01:00) Belgrade</option> 
<option value="Berlin">(GMT+01:00) Berlin</option> 
<option value="Bern">(GMT+01:00) Bern</option> 
<option value="Bratislava">(GMT+01:00) Bratislava</option> 
<option value="Brussels">(GMT+01:00) Brussels</option> 
<option value="Budapest">(GMT+01:00) Budapest</option> 
<option value="Copenhagen">(GMT+01:00) Copenhagen</option> 
<option value="Ljubljana">(GMT+01:00) Ljubljana</option> 
<option value="Madrid">(GMT+01:00) Madrid</option> 
<option value="Paris">(GMT+01:00) Paris</option> 
<option value="Prague">(GMT+01:00) Prague</option> 
<option value="Rome">(GMT+01:00) Rome</option> 
<option value="Sarajevo">(GMT+01:00) Sarajevo</option> 
<option value="Skopje">(GMT+01:00) Skopje</option> 
<option value="Stockholm">(GMT+01:00) Stockholm</option> 
<option value="Vienna">(GMT+01:00) Vienna</option> 
<option value="Warsaw">(GMT+01:00) Warsaw</option> 
<option value="West Central Africa">(GMT+01:00) West Central Africa</option> 
<option value="Zagreb">(GMT+01:00) Zagreb</option> 
<option value="Athens">(GMT+02:00) Athens</option> 
<option value="Bucharest">(GMT+02:00) Bucharest</option> 
<option value="Cairo">(GMT+02:00) Cairo</option> 
<option value="Harare">(GMT+02:00) Harare</option> 
<option value="Helsinki">(GMT+02:00) Helsinki</option> 
<option value="Istanbul">(GMT+02:00) Istanbul</option> 
<option value="Jerusalem">(GMT+02:00) Jerusalem</option> 
<option value="Kyiv">(GMT+02:00) Kyiv</option> 
<option value="Pretoria">(GMT+02:00) Pretoria</option> 
<option value="Riga">(GMT+02:00) Riga</option> 
<option value="Sofia">(GMT+02:00) Sofia</option> 
<option value="Tallinn">(GMT+02:00) Tallinn</option> 
<option value="Vilnius">(GMT+02:00) Vilnius</option> 
<option value="Baghdad">(GMT+03:00) Baghdad</option> 
<option value="Kuwait">(GMT+03:00) Kuwait</option> 
<option value="Minsk">(GMT+03:00) Minsk</option> 
<option value="Moscow">(GMT+03:00) Moscow</option> 
<option value="Nairobi">(GMT+03:00) Nairobi</option> 
<option value="Riyadh">(GMT+03:00) Riyadh</option> 
<option value="St. Petersburg">(GMT+03:00) St. Petersburg</option> 
<option value="Volgograd">(GMT+03:00) Volgograd</option> 
<option value="Tehran">(GMT+03:30) Tehran</option> 
<option value="Abu Dhabi">(GMT+04:00) Abu Dhabi</option> 
<option value="Baku">(GMT+04:00) Baku</option> 
<option value="Muscat">(GMT+04:00) Muscat</option> 
<option value="Tbilisi">(GMT+04:00) Tbilisi</option> 
<option value="Yerevan">(GMT+04:00) Yerevan</option> 
<option value="Kabul">(GMT+04:30) Kabul</option> 
<option value="Ekaterinburg">(GMT+05:00) Ekaterinburg</option> 
<option value="Islamabad">(GMT+05:00) Islamabad</option> 
<option value="Karachi">(GMT+05:00) Karachi</option> 
<option value="Tashkent">(GMT+05:00) Tashkent</option> 
<option value="Chennai">(GMT+05:30) Chennai</option> 
<option value="Kolkata">(GMT+05:30) Kolkata</option> 
<option value="Mumbai">(GMT+05:30) Mumbai</option> 
<option value="New Delhi">(GMT+05:30) New Delhi</option> 
<option value="Sri Jayawardenepura">(GMT+05:30) Sri Jayawardenepura</option> 
<option value="Kathmandu">(GMT+05:45) Kathmandu</option> 
<option value="Almaty">(GMT+06:00) Almaty</option> 
<option value="Astana">(GMT+06:00) Astana</option> 
<option value="Dhaka">(GMT+06:00) Dhaka</option> 
<option value="Novosibirsk">(GMT+06:00) Novosibirsk</option> 
<option value="Urumqi">(GMT+06:00) Urumqi</option> 
<option value="Rangoon">(GMT+06:30) Rangoon</option> 
<option value="Bangkok">(GMT+07:00) Bangkok</option> 
<option value="Hanoi">(GMT+07:00) Hanoi</option> 
<option value="Jakarta">(GMT+07:00) Jakarta</option> 
<option value="Krasnoyarsk">(GMT+07:00) Krasnoyarsk</option> 
<option value="Beijing">(GMT+08:00) Beijing</option> 
<option value="Chongqing">(GMT+08:00) Chongqing</option> 
<option value="Hong Kong">(GMT+08:00) Hong Kong</option> 
<option value="Irkutsk">(GMT+08:00) Irkutsk</option> 
<option value="Kuala Lumpur">(GMT+08:00) Kuala Lumpur</option> 
<option value="Perth">(GMT+08:00) Perth</option> 
<option value="Singapore">(GMT+08:00) Singapore</option> 
<option value="Taipei">(GMT+08:00) Taipei</option> 
<option value="Ulaan Bataar">(GMT+08:00) Ulaan Bataar</option> 
<option value="Osaka">(GMT+09:00) Osaka</option> 
<option value="Sapporo">(GMT+09:00) Sapporo</option> 
<option value="Seoul">(GMT+09:00) Seoul</option> 
<option value="Tokyo">(GMT+09:00) Tokyo</option> 
<option value="Yakutsk">(GMT+09:00) Yakutsk</option> 
<option value="Adelaide">(GMT+09:30) Adelaide</option> 
<option value="Darwin">(GMT+09:30) Darwin</option> 
<option value="Brisbane">(GMT+10:00) Brisbane</option> 
<option value="Canberra">(GMT+10:00) Canberra</option> 
<option value="Guam">(GMT+10:00) Guam</option> 
<option value="Hobart">(GMT+10:00) Hobart</option> 
<option value="Magadan">(GMT+10:00) Magadan</option> 
<option value="Melbourne">(GMT+10:00) Melbourne</option> 
<option value="Port Moresby">(GMT+10:00) Port Moresby</option> 
<option value="Solomon Is.">(GMT+10:00) Solomon Is.</option> 
<option value="Sydney">(GMT+10:00) Sydney</option> 
<option value="Vladivostok">(GMT+10:00) Vladivostok</option> 
<option value="New Caledonia">(GMT+11:00) New Caledonia</option> 
<option value="Auckland">(GMT+12:00) Auckland</option> 
<option value="Fiji">(GMT+12:00) Fiji</option> 
<option value="Kamchatka">(GMT+12:00) Kamchatka</option> 
<option value="Marshall Is.">(GMT+12:00) Marshall Is.</option> 
<option value="Wellington">(GMT+12:00) Wellington</option> 
<option value="Nuku&#x27;alofa">(GMT+13:00) Nuku&#x27;alofa</option> 
<option value="Samoa">(GMT+13:00) Samoa</option> 
<option value="Tokelau Is.">(GMT+13:00) Tokelau Is.</option></select> 

问题是关于如何翻译这些?好吧,我没有任何硬性的证明,但出现,这些时区密钥全部是部分位的Windows时区显示名称。它们在Windows或任何Microsoft技术中都不是独特的标识符。我很困惑为什么Yammer会选择这些作为时区id。但你会怎么做它的方式如下:

  • 看看CLDR Windows Zone mapping file。你会看到条目,如:

    <!-- (UTC-08:00) Pacific Time (US & Canada) --> 
    <mapZone other="Pacific Standard Time" territory="001" type="America/Los_Angeles"/> 
    <mapZone other="Pacific Standard Time" territory="CA" type="America/Vancouver America/Dawson America/Whitehorse"/> 
    <mapZone other="Pacific Standard Time" territory="MX" type="America/Tijuana"/> 
    <mapZone other="Pacific Standard Time" territory="US" type="America/Los_Angeles"/> 
    <mapZone other="Pacific Standard Time" territory="ZZ" type="PST8PDT"/> 
    <!-- (UTC-07:00) Arizona --> 
    <mapZone other="US Mountain Standard Time" territory="001" type="America/Phoenix"/> 
    <mapZone other="US Mountain Standard Time" territory="CA" type="America/Dawson_Creek America/Creston"/> 
    <mapZone other="US Mountain Standard Time" territory="MX" type="America/Hermosillo"/> 
    <mapZone other="US Mountain Standard Time" territory="US" type="America/Phoenix"/> 
    <mapZone other="US Mountain Standard Time" territory="ZZ" type="Etc/GMT+7"/> 
    <!-- (UTC-07:00) Chihuahua, La Paz, Mazatlan --> 
    <mapZone other="Mountain Standard Time (Mexico)" territory="001" type="America/Chihuahua"/> 
    <mapZone other="Mountain Standard Time (Mexico)" territory="MX" type="America/Chihuahua America/Mazatlan"/> 
    
  • 搜索在注释行的Yammer的时区项,为部分字符串匹配。例如,如果Yammer时区为"La Paz",它将与条目相匹配<!-- (UTC-07:00) Chihuahua, La Paz, Mazatlan -->

  • 从评论后面的下一行获取IANA时区ID。这将是标有territory="001"的那个。你想要type字段。对于前面的例子,这将是"America/Chihuahua"

  • 您可以在Java中使用该标识与任何标准的Java 7或Java 8 API(或带有Joda时间)。

最后一点。我检查了(通过用户API)在我自己的Yammer网络中的许多人的timezone设置,我知道它在其他时区,并且只有少数人从"Pacific Time (US & Canada)"默认设置改变了他们的时区。因此,我相信这些值是准确的。据我所知,没有任何东西会迫使Yammer用户从默认设置中更改此设置,他们必须竭尽全力去做。

+0

感谢您的好评。我想知道这个值是否与locale相关。 – cdmckay

+0

通常,Windows时区显示名称确实是本地化的 - 按照Windows操作系统的语言。然而,由于在这里它们被用作标识符,所以即使该网站已被本地化为另一种语言,我也会怀疑将关键值固定在英文名称上。 –

0

如果Yammer向您提供了一个,那么您最好使用时区偏移量。据我所知,Yammer给你的时区字符串是不正确的(或者至少是微软专用的)。如果执行该Java代码:

System.out.println(Arrays.toString(TimeZone.getAvailableIDs())); 

,你会发现该字符串Pacific Time (US & Canada)没有出现在它,因为它是(我认为)一个微软式的时区的名称,以及只知道自己的原因,微软决定以不同的名称命名它们。

+1

我不明白这是如何回答这个问题的。 –

3

对于使用“友好”时区名称而不是标准“America/Los_Angeles”的Ruby on Rails时间API,这看起来很熟悉。正如另一个答案中所建议的那样,实际上可能是Windows名称。

这导致我到this discussion about TimeZones in Java,从那里到a Github repo,它提供了Java程序的这些Windows名称。

看起来你将不得不把你的日期时间的东西包装在你自己借用或编写的翻译层中。

+0

他们不是Rails时区,尽管我可以看到你怎么会被认为是这样。此外,该github repo中的映射尚未维护,它映射了Windows ID - 而不是Yammer似乎正在使用的Cludgy部分显示名称。 –

相关问题