如何在安卓中获取关于另一个时区的时间?

6

我希望创建一个针对FIFA 2014世界杯比赛的闹钟应用程序。该应用程序将有一个服务器,存储在巴西/阿克里州进行比赛的日期和时间。我的客户端是一个Android应用程序,而Android设备可能拥有任何可能的时区。因此,我的问题是我想将巴西/阿克里州的时间转换为具有不同时区的本地Android设备时间。经过大量搜索,我了解到Joda数据和时间库可以实现这一点,但它在Android上运行速度太慢了。请建议任何适合我的代码。


你的日期是什么格式的(字符串、毫秒等等)? - Squonk
年,月份,日,小时,分钟,秒 - Neeraj Sharma
String sdate = "" + cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND); 日期字符串sdate被赋值为""+cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+"-"+cal.get(Calendar.DAY_OF_MONTH)+" "+cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND); - Neeraj Sharma
让我们在聊天中继续这个讨论 - Neeraj Sharma
我必须将设备的本地时区转换为服务器保存的巴西/阿克里时间,但我无法更改该时间,因为我没有授权。 - Neeraj Sharma
显示剩余7条评论
5个回答

8

我认为Time类是最适合你的工作的。此外,它是Android API而不是一般的Java API。

这里我提到了一些对你的工作有用的方法:

void switchTimezone(String timezone)

将此时间对象转换为另一个时区,保持时间不变。
static String getCurrentTimezone()

返回当前设备设置的时区字符串。

如果你想以时区无关的方式保存时间,可以使用toMillis()方法将其转换为毫秒(在UTC中),然后使用set(long millis)方法检索它。

如果有不清楚的地方,请告诉我!

更新

示例:

long timeMillis = /* get time milliseconds form the server */
Time time = new Time();
time.set(timeMillis);

/* changing time zone */
time.switchTimezone(/* your desired timezone in string format */);

/* getting time as string  */
String timeString = time.format("%Y%m%dT%H%M%S"); // you can change format as you wish

这里有一个表格,用于格式化时间。


2
您可以使用以下代码,它会减去巴西和本地时区之间的小时差。只需将yourDate替换为一个日期对象即可。
//code...
yourDate.setTime(yourDate.getTime() - getDifferenceInMillis());
//code...

public int getDifferenceInMillis() {
    // Local Time
    int localMinute = Calendar.getInstance().get(Calendar.MINUTE);
    int localHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
    int localDay = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);

    // Brazil Time
    Calendar c = new GregorianCalendar(TimeZone.getTimeZone("Brazil/Acre"));
    c.setTimeInMillis(new Date().getTime());
    int brazilMinute = c.get(Calendar.MINUTE);
    int brazilHour = c.get(Calendar.HOUR_OF_DAY);
    int brazilDay = c.get(Calendar.DAY_OF_MONTH);

    // Difference between Brazil and local
    int minuteDifference = brazilMinute - localMinute;
    int hourDifference = brazilHour - localHour;
    int dayDifference = brazilDay - localDay;
    if (dayDifference != 0) {
        hourDifference = hourDifference + 24;
    }
    return (hourDifference * 60 + minuteDifference) * 60 * 1000;
}

分钟的差别怎么样? - Neeraj Sharma
现在它还可以计算分钟差异。不需要计算秒差,因为时区只有几分钟的差别。 - Manuel Allenspach
但是您的代码总是给出相同的结果,-9差异,我的本地时区是GMT+05:30。 - Neeraj Sharma
我修改了代码,你需要再次复制它 ;) - Manuel Allenspach

0
你应该在服务器上将日期存储为长整型或时间戳。如果你不想这样做,你仍然可以将日期作为从数据库日期生成的长整型发送。然后按照以下方式创建你的日历实例:
        Calendar c = Calendar.getInstance();
        c.setTime(new Date(yourdatelong));

你可以在你的长整型中乘以和加上一些常量。在Java中,它的定义是“自1970年1月1日00:00:00以来的毫秒数”。在C#中则不同,例如(如果我没记错的话)是从1900年1月1日开始计算纳秒数。

这样,你就可以确保在所有设备上设置相同的日期。完成后,你只需在你的日历中设置所需的时区即可显示本地时间。

http://developer.android.com/reference/java/util/Calendar.html

您可以有许多选项来管理时间并在此类中显示它。


this is not i am looking for - Neeraj Sharma
该死,我不明白你想做什么... 你想改变日期的显示还是你想改变日期本身? - Eliott Roynette
请仔细再次阅读问题。我提到我想将巴西/阿克里州的服务器时间更改为带日期的本地时间。 - Neeraj Sharma
我编辑了我的回答,请告诉我是否更好。 - Eliott Roynette

0
如果日期存储在服务器时区(巴西/阿克里州),您应该从数据库加载日期时间,将其转换为UTC时区并发送到客户端。在客户端上,将UTC更改为本地时区:
服务器端:
DateTime dateOnServer = // load date from db
DateTime dateUTC = dateOnServer.withZone(DateTimeZone.UTC); // convert to UTC  
String dateAsStringUTC = dateUTC.toString("yyyy-MM-ddTHH:mm:ss");
// send 'dateAsStringUTC' to client  

客户端:

String dateAsStringUTC = // receive date from server
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-ddTHH:mm:ss"); // parser for date 
DateTime dateOnClient= dtf.parseDateTime(dateAsStringUTC); 
// 'dateOnClient' will be in client time zone 'DateTimeZone.getDefault()'

-2

我遇到了和你一样的问题...

我使用了SimpleDateFormat找到了解决方案。

SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sourceFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date parsed = format.parse("2011-03-01 15:10:37"); // => Date is in UTC now

TimeZone tz = TimeZone.getTimeZone("America/Chicago");
SimpleDateFormat destFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
destFormat.setTimeZone(tz);

String result = destFormat.format(parsed);

这可能对你有所帮助..


更详细的信息,请参考此链接SimpleDateFormat,它将为您提供有关您的问题的详细信息。 - Pragnesh Ghoda シ
它所做的只是以不同的方式格式化日期。它不会根据时区和夏令时变化将UTC时间转换为本地时间。 - Squonk
这不是你的代码。你是从SO上的另一个答案中复制粘贴过来的,而且你没有注明原始答案。 - Squonk
1
第一次回答时,那是我的代码...但当我编辑答案时,我忘记删除那行了...兄弟。 - Pragnesh Ghoda シ
1
不用担心,Prag,这种情况时有发生,但请继续回答问题,我会在你回答正确时给你点赞的。 - Neeraj Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接