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 时: 在此处输入图像描述

为什么它们都是 gmt+2 而第一个不是迈阿密时区?

4

2 回答 2

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

您可以使用“America/New_York”或“GMT-4”。然而,Chilledrat 提到的最后一个可能在夏令时存在一些问题。

于 2012-04-16T08:26:11.133 回答
6

好的,经过多次试验终于弄明白了。我观察到的问题是,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());

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

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

于 2012-04-16T09:14:02.280 回答