【发布时间】:2019-05-12 12:44:15
【问题描述】:
我从我的 GPS 跟踪器中得到一个 UTC 格式的时间字符串,如下所示:hhmmss.ssss。
我想使用 日历 将 UTC 时间转换为用户的本地时间。所以我通过substring(int start, int end)从时间字符串中提取小时、分钟和秒,并通过Calendar.set(int field, int value)函数设置它。在此之后,我将Calendar 转换为Date,但我知道我有错误的一天。
例如timestamp = 091215.0000,
如果我登录Calendar.getInstance()我得到:Thu Dec 11 10:12:15 GMT+01:00 2018
但是当我用我的函数转换它时,我得到:Thu Dec 13 10:12:15 GMT+01:00 2018
我的功能
public static Date utcToLocalTimeFromLock(String timestamp) {
Calendar calendar = Calendar.getInstance();
if (timestamp.charAt(0) == '0') {
calendar.set(Calendar.HOUR_OF_DAY, timestamp.charAt(1) + 1);
} else {
calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(timestamp.substring(0, 2) + 1));
}
calendar.set(Calendar.MINUTE, Integer.valueOf(timestamp.substring(2, 4)));
calendar.set(Calendar.SECOND, Integer.valueOf(timestamp.substring(4, 6)));
Date date = calendar.getTime();
Log.d(LOG_TAG, "utcToLocalTimeFromLock: " + date);
return date;
}
【问题讨论】:
-
我强烈建议您避免自己编写文本处理代码 - Java 中已经有大量代码可以为您执行此操作。接下来,避免使用 java.util.Date 和 java.util.Calendar - 改用 java.time 类型。它们更更容易使用。 (例如,您使用
Calendar意味着它正在解释默认时区中的值,据我所知,这不是您想要实现的......) -
java.time 是我必须添加到我的 Android 项目中的库吗?我找不到它,我自己写的,因为 GPS 跟踪器的时间不是以秒或毫秒为单位的正常时间戳。我也使用日期,因为这是我将其保存在数据库中的格式。但我看看 java.time :)
-
它是普通 Java 的一部分。您需要检查哪个版本的 Android 支持它与您定位的 Android 版本。如果你真的非常需要使用
Date,我建议你使用SimpleDateFormatter来进行解析,并确保将时区设置为UTC。 -
为什么你的时间戳不包含日期?这似乎非常容易出错。您是否使用公共 API 进行 GPS 跟踪?是否有单独的
date字段可用? -
对于 26 以下的 Android API 级别,请使用 java.time 的 backport。它已在ThreeTenABP 中适用于Android。
标签: java android date calendar