2011-02-01 13 views
5

我的服务器向我发送格式为“America/Los Angeles”的时区。在客户端,我有一段时间需要在该时区显示。答案将是“PST”或“PDT”,具体取决于特定时间的夏令时。我如何进行转换?在Java ME中将“America/Los Angeles”时区转换为“PST”或“PDT”

我在Java ME(黑莓4.7,准确),所以我不能使用乔达时间。

我需要快速计算大量日期(但只有一个时区),所以我不能让服务器发送一个偏移量,因为偏移量可能会根据日期发生变化。

编辑:让我重申这个问题,因为似乎有一些混淆。我有一个zoneinfo名称和一个日期。我想知道那个时区在那个时间点GMT的偏移量。答案将根据夏令时而变化。

作为额外的好处,我想让TLA向用户展示(即“PST”或“PDT”),但这是次要的。

解决方案:我会在这里总结一下解决方案,因为从下面的答案中可以看出它并不是非常清楚。这基本上是我在J2ME中所需要的:

TimeZone zone = TimeZone.getTimeZone("America/Los_Angeles"); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeZone(zone); 

calendar.setTime(new Date(2011, 1, 1, 12, 0, 0));  
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 
calendar.setTime(new Date(2011, 6, 1, 12, 0, 0)); 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 
+0

由于[此回答](https://stackoverflow.com/a/31171284/659077),'Amrica/Los_angeles'和'PDT'有相等的抵消! – 2017-11-04 06:08:31

回答

6

可能这就是你想要的。这在我的机器上使用标准的java。

 Calendar calendar = Calendar.getInstance();  
     TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles"); 
     calendar.setTimeZone(tz); 
     System.out.println("Offset from UTC="+tz.getOffset(calendar.getTimeInMillis())/(60*60*1000)); //prints -8 
     System.out.println(tz.getDisplayName(Boolean.TRUE, 0)); //prints PDT 
     System.out.println(tz.getDisplayName(Boolean.TRUE, 1)); //prints Pacific Daylight Time 
     System.out.println(tz.getDisplayName(Boolean.FALSE, 0));//prints PST 
     System.out.println(tz.getDisplayName(Boolean.FALSE, 1));//prints Pacific Standard Time 

更新:OP上面说不适用于J2ME工作。谷歌搜索后,我发现here getOffset()实际上是getRawOffset()在J2ME。但是,它看起来不像是支持displayName。我认为您唯一的选择是使用getAvailableIds()来查看ID。

1

是否J2ME不支持TimeZone.getTimeZone(id)?这基本上是你想要的,以获得时区偏移量等。我希望J2ME支持zoneinfo区域名称。

+0

无论日期如何,这都给了我带有ID为“America/Los Angeles”的时区,该时区与PST完全相同。 – 2011-02-01 23:40:39

+0

BlackBerry的TimeZone实现支持zoneinfo名称。我认为OP的问题在于他接收时区缩写,而不是zoneinfo名称。如果BlackBerry无法识别缩写,则默认为GMT。不幸的是,BB模型通常不知道很多缩写。您可以使用`TimeZone.getAvailableIDs()`来查看特定平台上支持的内容。 – 2011-02-01 23:47:09