2012-04-16 88 views
1

我有一个android应用程序的时区的问题。安卓日历时区不工作?

下面的代码

是我的例子:

Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("America/Miami")); 
    c2 = Calendar.getInstance(TimeZone.getDefault()); 
    c2.set(2012, Calendar.MAY, 1, 9, 0, 0); 

    tv2.setText(c1.getTime().toString()); 
    tv3.setText(c2.getTime().toString()); 

当我启动应用程序,并期待在textViews我发现: enter image description here

为什么他们都GMT + 2和第一不迈阿密时区?

+1

AFAIK,只有当您的设备具有特定时区时,您的时区才能使用。你为什么不尝试使用String [] getAvailableIDs()来检查你是否有特定的时区。你也可以尝试使用TimeZone.getTimeZone(“GMT + 14:00”),你提供的时区使用的是GMT – Shubhayu 2012-04-16 07:44:54

+0

好吧,没有迈阿密,所以我改为“New_York”,但它仍然不工作。 – gurehbgui 2012-04-16 07:51:14

+0

当我将其更改为TimeZone.getTimeZone(“GMT-05:00”)时,它不起作用 – gurehbgui 2012-04-16 07:54:19

回答

6

我可以复制您遇到的问题。您可以通过以下操作获得在迈阿密时区的正确时间:

Calendar c1 = new GregorianCalendar(TimeZone.getTimeZone("GMT-4")); 
int hour = c1.get(Calendar.HOUR);   
int minutes = c1.get(Calendar.MINUTE);  
int seconds = c1.get(Calendar.SECOND); 

tv2.setText(String.format("%d:%d:%d", hour, minutes, seconds)); 

输出:4点22分41秒

您可以使用“美国/纽约”或“GMT-4”。然而,Chilledrat提到的最后一个可能会遇到一些夏令时问题。

+0

这种方法在夏令时更改时是否存在问题? – Chilledrat 2012-04-16 11:00:19

+0

是的,我认为你是对的。你可以使用“America/New_York”,这应该和迈阿密相同的时区。 Calendar c1 = new GregorianCalendar(TimeZone.getTimeZone(“America/New_York”)); – Priebe 2012-04-16 11:42:51

5

好吧,经过大量的试验,终于搞清楚了。我观察到的问题是,Calendar的getTime()似乎总是返回当前TimeZone中的日期。我仍然没有发现任何说明这种方式的数据。

要以您想要的方式获取数据,我们需要引入SimpleDataFormat。这是我所做的获取数据。

Calendar c1 = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"), Locale.US); 
Calendar c2 = Calendar.getInstance(TimeZone.getDefault()); 
c2.set(2012, Calendar.MAY, 1, 9, 0, 0); 

SimpleDateFormat sdf = new SimpleDateFormat(); 
sdf.setCalendar(c1); 
tv2.setText(sdf.format(c1.getTime())); 
tv3.setText(c2.getTime().toString()); 

在这里,您可以根据定义的时区获得输出。

注意我也使用了Locale,因为它应该是推荐的做法。告诉我这是否适合你。