使用JodaTime在Local到UTC和UTC到Local之间进行转换

时间:2015-05-05 00:33:24

标签: jodatime

我正在开发一个聊天应用程序,用户可能正在使用来自不同国家/地区的应用。为了显示正确的日期和时间,我使用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;
}

1 个答案:

答案 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();