我目前正在開發一個應用程序,根據用戶的位置(經度和緯度,通常從GPS獲取)和時間顯示太陽系的行星。這些行星(據我所知,它不是我的原始代碼)依賴於UTC時間戳,因此如果用戶在格林威治標準時間(aka UTC),行星顯得很好。但是隨着用戶走遍世界各地,特別是中國和美國,這些行星出現在錯誤的地方(太陽是最明顯的一個 - 忽略它的星星)。我似乎得到的時間傳遞到星球位置計算不正確,我不知道爲什麼。Android時間,時區和GPS位置
我已經有各種版本,但似乎沒有工作到目前爲止,它幾乎不可能分辨出是否有效,直到我發送出去並收到一封電子郵件回來告訴我我錯了。我們認爲這可能是GSM/CDMA衝突,但似乎並非如此。
以下是原始代碼來創建與GMT時間日曆:
public static Calendar convertToGmt(Calendar cal)
{
Date date = cal.getTime();
TimeZone tz = cal.getTimeZone();
//log.debug("input calendar has date [" + date + "]");
//Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
long msFromEpochGmt = date.getTime();
//gives you the current offset in ms from GMT at the current date
int offsetFromUTC = tz.getOffset(msFromEpochGmt);
//log.debug("offset is " + offsetFromUTC);
//create a new calendar in GMT timezone, set to this date and add the offset
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.setTime(date);
gmtCal.add(Calendar.MILLISECOND, offsetFromUTC);
//log.debug("Created GMT cal with date [" + gmtCal.getTime() + "]");
return gmtCal;
}
這後來改爲:
public static Calendar convertToGmt(Calendar cal)
{
Calendar gmtCal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
long time = cal.getTimeInMillis();
long offset = cal.getTimeZone().getRawOffset();
gmtCal.setTimeInMillis(time - offset);
return gmtCal;
}
而最新的版本:
public static Calendar convertToGmt(Calendar cal)
{
TimeZone timezone = TimeZone.getDefault();
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
int currentGMTOffset = timezone.getOffset(cal.getTimeInMillis());
int gmtOffset = utcTimeZone.getOffset(cal.getTimeInMillis());
cal.setTimeInMillis(cal.getTimeInMillis() + (gmtOffset - currentGMTOffset));
return cal;
}
在前兩個版本的Calendar實例正在傳回,而第三個版本(爲了優化它)mer ely更新它的一個靜態實例。今天早上修改我想也許使用System.currentTimeInMillis,即:
private static Calendar utc = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
private static Calendar cal = Calendar.getInstance();
public static void convertToGmt()
{
cal.setTimeInMillis(System.currentTimeMillis());
utc.setTimeInMillis(cal.getTimeInMillis());
}
但我不知道這有什麼區別。
我真的很迷茫 - 有人可以向我解釋我哪裏出錯或我該如何解決問題?我希望其他幾雙眼睛可能會有所幫助! :)
那麼在一個點上的代碼只是'日曆gmtCal =新GregorianCalendar的(TimeZone.getTimeZone( 「GMT」));返回gmtCal;'但我們仍然有用戶以錯誤的位置響應,並且由於日期/時間可以在電話設置中進行配置,所以我們假設時區差異會拋出返回的值。 – batterj2