我正在开发一个聊天应用程序,用户可能正在使用来自不同国家/地区的应用。为了显示正确的日期和时间,我使用JodaTime api并将本地时间转换为UTC,然后将其保存在数据库中。转换似乎很好。但是,UTC到当地时间没有显示正确的结果。请参阅下面的代码并向我推荐最佳解决方案。
public static Date convertLocalToUTC(Date date)
{
Log.i(LOG_TAG, "local date:"+date);
DateTimeZone tz = DateTimeZone.getDefault();
Date targetDate = new Date(tz.convertLocalToUTC(date.getTime(), false));
Log.i(LOG_TAG, "utc date:"+targetDate);
return targetDate;
}
public static Date convertUTCToLocal(Date date)
{
DateTimeZone tz = DateTimeZone.getDefault();
Log.i(LOG_TAG, "utc date:"+date);
Date targetDate = new Date(tz.convertUTCToLocal(date.getTime()));
Log.i(LOG_TAG, "local date:"+targetDate);
return targetDate;
}
答案 0 :(得分:0)
我建议完全不要使用java.util.Date。请注意,java.util.Date表示即时,它没有时区信息。将它从UTC转换为本地"不是一个有效的概念。
不幸的是,JDBC接口仍然需要使用的java.sql.Timestamp / java.sql.Date等,这可能需要特定的驱动程序固定到获取存储正确的事情。并非所有JDBC实现者都了解日期/时间在Java中的工作方式。将ISO格式的字符串传递给数据库可能更清楚。
例如,这是我们使用MySQL将JodaTime Instants转换为java.sql.Timestamp的代码:
st.setTimestamp(index,
new java.sql.Timestamp(instant.toDateTime(DATABASE_TIMEZONE)
.withZoneRetainFields(DateTimeZone.getDefault())
.getMillis()));
这是必要的,因为MySQL驱动程序坚持将java.sql.Timestamp作为默认时区读取。类似的恶作剧是阅读时间戳的必要条件:
java.sql.Timestamp timestamp = rs.getTimestamp(names[0]);
return new DateTime(timestamp.getTime())
.withZoneRetainFields(DATABASE_TIMEZONE)
.toInstant();