我希望创建一个针对FIFA 2014世界杯比赛的闹钟应用程序。该应用程序将有一个服务器,存储在巴西/阿克里州进行比赛的日期和时间。我的客户端是一个Android应用程序,而Android设备可能拥有任何可能的时区。因此,我的问题是我想将巴西/阿克里州的时间转换为具有不同时区的本地Android设备时间。经过大量搜索,我了解到Joda数据和时间库可以实现这一点,但它在Android上运行速度太慢了。请建议任何适合我的代码。
我希望创建一个针对FIFA 2014世界杯比赛的闹钟应用程序。该应用程序将有一个服务器,存储在巴西/阿克里州进行比赛的日期和时间。我的客户端是一个Android应用程序,而Android设备可能拥有任何可能的时区。因此,我的问题是我想将巴西/阿克里州的时间转换为具有不同时区的本地Android设备时间。经过大量搜索,我了解到Joda数据和时间库可以实现这一点,但它在Android上运行速度太慢了。请建议任何适合我的代码。
我认为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
这里有一个表格,用于格式化时间。
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;
}
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
您可以有许多选项来管理时间并在此类中显示它。
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()'
我遇到了和你一样的问题...
我使用了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);
这可能对你有所帮助..