如何在android中获得与另一个时区相关的时间

时间:2014-05-31 10:18:51

标签: java android timezone jodatime

我想为FIFA 2014世界杯比赛创建一个警报应用程序,其中我有一个服务器,存储在巴西/英亩的比赛的日期和时间,我的客户端是一个Android应用程序和Android设备可能有任何可能的时区所以我的问题是我想用不同的时区将巴西/英亩的时间转换为本地的Android设备时间,经过大量的谷歌搜索后,我开始了解joda数据和时间,但是它在android中太慢了所以请建议任何适合我的代码。

5 个答案:

答案 0 :(得分:7)

在我看来Time class对你的工作是最好的。此外, 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
格式化时间

Here is a table

答案 1 :(得分:1)

您可以使用此代码来减少巴西与当地时区之间的小时差。只需用日期对象替换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;
}

答案 2 :(得分:0)

您应该在服务器中存储日期长或时间戳。如果你不想要,你可以将你的日期作为数据库日期的长期生成发送。然后创建您的日历实例:

        Calendar c = Calendar.getInstance();
        c.setTime(new Date(yourdatelong));

你可以在你的长篇中加倍并添加一些常数。在java中,定义是“自1970年1月1日00:00:00以来的毫秒数”。它在C#中是不同的,例如(如果我记得很好的话,从19/1年1月1日开始纳秒的数量)。

就像你一样,你肯定会在你的所有设备中设置相同的日期。完成后,您只需将日历中所需的时区显示为当地时间。

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

您可以有多种方法来管理时间并在此课程中显示。

答案 3 :(得分:0)

如果日期存储在服务器时区(巴西/英亩),您应该从DB加载日期时间,将其转换为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()'

答案 4 :(得分:-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);

这可能对你有帮助..