gpt4 book ai didi

java - Android 时间、时区和 GPS 位置

转载 作者:行者123 更新时间:2023-11-29 09:22:40 33 4
gpt4 key购买 nike

我目前正在开发一个应用程序,该应用程序根据用户的位置(经度和纬度,通常从 GPS 获取)和时间显示太阳系的行星。这些行星(据我所知,它不是我的原始代码)取决于 UTC 时间戳,因此如果用户处于 GMT(又名 UTC),行星看起来很好。

但随着用户在世界范围内走得更远,尤其是中国和美国,行星出现在错误的位置(太阳是最明显的——忽略它是一颗恒星的事实)。我似乎将时间传递给行星位置计算不正确,我不确定为什么。

我已经发布了各种版本,但到目前为止似乎都没有用,而且在我将它发送出去并收到一封电子邮件告诉我我错了之前,几乎不可能判断某些东西是否有效。我们认为这可能是 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 实例被传回,而第三个版本(为了优化它)仅仅更新它的一个静态实例。今天早上修补我在想也许使用 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());
}

但我不确定这有什么不同。

我真的很迷茫 - 有人可以向我解释我哪里出错了或者我应该如何解决这个问题吗?我希望其他几双眼睛可能会有所帮助! :)

最佳答案

如果应用程序接受经度和纬度,为什么时区很重要?我的方法是只使用日期、时间和经度/纬度来计算行星的位置。 java.util.Date 在内部存储 GMT 时间,因此似乎没有必要手动转换为 GMT。

关于java - Android 时间、时区和 GPS 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5298594/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com