В настоящее время я работаю над приложением, которое показывает планеты Солнечной системы в зависимости от местоположения пользователя (долгота и широта, обычно получаемые с GPS) и времени.Эти планеты (насколько я могу судить, это не мой исходный код) зависят от метки времени UTC, и в результате, если пользователь находится в GMT (или UTC), планеты выглядят нормально.
Но когда пользователи идут дальше по всему миру, в частности, в Китае и США, планеты появляются в неправильных местах (наиболее очевидным является Солнце - не обращайте внимания на тот факт, что это звезда).Мне кажется, что время, потраченное на вычисление положения планеты, неверно, и я не знаю почему.
У меня были разные версии, но, похоже, ни одна из них не работает до сих пор, и почти невозможно определить, работает ли что-то, пока я не отправлю это и не получу электронное письмо, сообщающее мне, что я неправ.Мы думали, что это может быть конфликт GSM / CDMA, но это не так.
Ниже приведен исходный код для создания Календаря со временем по Гринвичу:
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 передается обратно, тогда как третья версия (для его оптимизации) простообновляет статический экземпляр этого.Повозившись этим утром, я думаю, возможно, использую 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());
}
, но я не уверен, что это имеет какое-либо значение.
Я действительно теряюсь от этого -может кто-нибудь объяснить мне, где я иду не так или как я должен подойти к проблеме?Я надеюсь, что несколько других пар глаз могут помочь!:)