我从数据库中撤回日期和时间。它们存储在单独的字段中,但我想将它们组合成一个适当反映日期/时间的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;
}
答案 0 :(得分: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();
答案 1 :(得分:5)
在执行这些类型的事情时,使用Joda Time而不是Java自己的Date类。这是一个非常优越的日期/时间api,使您尝试做的事情非常简单和可靠。
答案 2 :(得分: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
- {{1}}应包含存储的值。
YMMV,告诫者等等......
答案 3 :(得分:1)
假设您知道从数据库中读取时间的时区,您需要使用先前在ResultSet.getTime(String, Calendar)
上设置时区的Calendar
方法。 JDBC驱动程序将对时间进行必要的调整。
如果所有代码都在运行服务器端,我强烈建议在所有时间标准化公共时区(可能是UTC),并在GUI中显示渲染时进行适当的转换。
我也会使用JodaTime(http://joda-time.sourceforge.net),这样可以避免将来的麻烦。