在 Java 中将本地时间戳转换为 UTC 时间戳
我有一个自本地纪元以来的毫秒时间戳,我想将其转换为自 UTC 纪元以来的毫秒时间戳。通过快速浏览文档,看起来像这样的东西可以工作:
int offset = TimeZone.getDefault().getRawOffset();
long newTime = oldTime - offset;
有没有更好的方法来做到这一点?
我有一个自本地纪元以来的毫秒时间戳,我想将其转换为自 UTC 纪元以来的毫秒时间戳。通过快速浏览文档,看起来像这样的东西可以工作:
int offset = TimeZone.getDefault().getRawOffset();
long newTime = oldTime - offset;
有没有更好的方法来做到这一点?
可悲的是,这似乎是最好的方法:
public static Date convertLocalTimestamp(long millis)
{
TimeZone tz = TimeZone.getDefault();
Calendar c = Calendar.getInstance(tz);
long localMillis = millis;
int offset, time;
c.set(1970, Calendar.JANUARY, 1, 0, 0, 0);
// Add milliseconds
while (localMillis > Integer.MAX_VALUE)
{
c.add(Calendar.MILLISECOND, Integer.MAX_VALUE);
localMillis -= Integer.MAX_VALUE;
}
c.add(Calendar.MILLISECOND, (int)localMillis);
// Stupidly, the Calendar will give us the wrong result if we use getTime() directly.
// Instead, we calculate the offset and do the math ourselves.
time = c.get(Calendar.MILLISECOND);
time += c.get(Calendar.SECOND) * 1000;
time += c.get(Calendar.MINUTE) * 60 * 1000;
time += c.get(Calendar.HOUR_OF_DAY) * 60 * 60 * 1000;
offset = tz.getOffset(c.get(Calendar.ERA), c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), c.get(Calendar.DAY_OF_WEEK), time);
return new Date(millis - offset);
}
(我知道这已经过了几个月的发布日期,但是在Android上使用短信时,这是一个非常有用的问题。
使用 a 获取本地纪元的偏移量,然后将其添加到本地纪元时间戳。Calendar
public static long getLocalToUtcDelta() {
Calendar local = Calendar.getInstance();
local.clear();
local.set(1970, Calendar.JANUARY, 1, 0, 0, 0);
return local.getTimeInMillis();
}
public static long converLocalTimeToUtcTime(long timeSinceLocalEpoch) {
return timeSinceLocalEpoch + getLocalToUtcDelta();
}