6

我正在从数据库中提取日期和时间。它们存储在单独的字段中,但我想将它们组合成一个适当地反映日期/时间的 java.util.Date 对象。

这是我最初的方法,但它有缺陷。我总是得到一个比它应该是 6 小时的日期/时间。我认为这是因为 Time 和 Date 都有时区偏移量,而我真的只需要其中一个来获得时区偏移量。

有关如何执行此操作的任何建议,以便为我提供正确的日期/时间?

import java.sql.Time;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang.time.DateUtils;
    public static Date combineDateTime(Date date, Time time)
        {
            if (date == null)
                return null;
            Date newDate = DateUtils.truncate(date, Calendar.DATE);
            if (time != null)
            {
                Date t = new Date(time.getTime());
                newDate = new Date(newDate.getTime() + t.getTime());
            }
            return newDate;
        }
4

4 回答 4

10

我会将日期和时间都放入日历对象中,然后使用各种日历方法从第二个对象中提取时间值并将它们放入第一个对象中。

  Calendar dCal = Calendar.getInstance();
  dCal.setTime(date);
  Calendar tCal = Calendar.getInstance();
  tCal.setTime(time);
  dCal.set(Calendar.HOUR_OF_DAY, tCal.get(Calendar.HOUR_OF_DAY));
  dCal.set(Calendar.MINUTE, tCal.get(Calendar.MINUTE));
  dCal.set(Calendar.SECOND, tCal.get(Calendar.SECOND));
  dCal.set(Calendar.MILLISECOND, tCal.get(Calendar.MILLISECOND));
  date = dCal.getTime();
于 2008-12-05T15:26:16.343 回答
5

在做这些类型的事情时,使用 Joda Time 而不是 Java 自己的 Date 类。这是一个非常出色的日期/时间 API,它使您尝试做的事情变得非常简单和可靠。

于 2008-12-05T15:31:19.750 回答
4

@Paul Tomblin是控制这个TimeZone问题的可靠方法,我知道有人会把“Joda Time”加入其中。其他答案都很好,比以下黑客更强大:

如果您的应用程序以TimeZone与数据库中的默认设置相同的方式执行,您可能能够摆脱以下情况:

如果您跳过此步骤:

Date t = new Date(time.getTime());

并直接使用该java.sql.Time值,例如:

newDate = new Date(newDate.getTime() + time.getTime());

TimeZone不会引入到默认值的转换-java.sql.Time应该包含存储的值。

YMMV、买者自保等……

于 2008-12-05T15:35:27.213 回答
1

假设您知道从数据库中读取的时间的时区,您需要使用ResultSet.getTime(String, Calendar)之前在Calendar. JDBC 驱动程序将对时间进行必要的调整。

如果所有代码都在服务器端运行,我强烈建议始终在公共时区(可能是 UTC)上进行标准化,并在 GUI 中显示渲染时进行适当的转换。

我也会使用 JodaTime ( http://joda-time.sourceforge.net ),它会在未来让你头疼。

于 2008-12-05T15:33:00.633 回答