Java.util.Date与Java.sql.Date - 日期值不同

时间:2013-04-18 12:16:25

标签: java date jdbc primefaces

我有一个包含字段W_PLANNED_DATE: 19/03/2013 10:55:00 (Date)

的Oracle数据库

在Java中,我将此值放入变量:

Date dteBeginOrWaitingItem = orWaitinglist.getWPlannedDate();

value: 2013-03-19

现在,我的时间发生了什么?我需要这个来填充primefaces的schedulelecomponent。 如何获得完整的日期和时间值

eventResourceAvailPerDay.addEvent(new DefaultScheduleEvent(reason, dteBeginOrWaitingItem, dteEndOrWaitingItem, "waitingitem"));

此方法将事件置于12:00 PM,因为没有其他时间或时间只是00:00:00

我知道如何使用Calendar类但它只是让我设置日期,时间似乎是空的但在数据库视图中我有一个日期时间值。

为myBean

import java.util.Date;
@ManagedBean(name="scheduleController")
@SessionScoped
public class ScheduleController implements Serializable {

private Date dteBeginOrWaitingItem, dteEndOrWaitingItem;

//methods
try
    {
        //eventWaitinglist.clear();
        OrWaitinglistDao orWaitinglistDao = new OrWaitinglistDaoImpl();
        waitingEvents = orWaitinglistDao.getOrWaitinglistKeysByResource(rKey);
        int i = 0;
        Iterator<OrWaitinglist> it2 = waitingEvents.iterator();
        while (it2.hasNext()) 
        {
            orWaitinglist = it2.next();
            dteBeginOrWaitingItem = (Date) orWaitinglist.getWPlannedDate();
            dteEndOrWaitingItem = orWaitinglist.getWPlannedDate();
            //dteEndOrWaitingItem = orWaitinglist.getWPlannedDate();
            reason = orWaitinglist.getWDescription();
            eventResourceAvailPerDay.addEvent(new DefaultScheduleEvent(reason, dteBeginOrWaitingItem, dteEndOrWaitingItem, "waitingitem"));

            i += 1;
            System.out.println("EventWaiting: " + i + " " + dteBeginOrWaitingItem + " " + dteEndOrWaitingItem + " " + reason);
        }
     }
    catch(java.util.EmptyStackException Ex)
    {
        System.out.println(Ex.getMessage());
    }

工作更新: 豆:

try
    {
        //eventWaitinglist.clear();
        OrWaitinglistDao orWaitinglistDao = new OrWaitinglistDaoImpl();
        waitingEvents = orWaitinglistDao.getOrWaitinglistKeysByResource(rKey);
        int i = 0;
        Iterator<OrWaitinglist> it2 = waitingEvents.iterator();
        while (it2.hasNext()) 
        {
            orWaitinglist = it2.next();
            Long wPlannedDate = orWaitinglist.getWPlannedDate().getTime();
            if (wPlannedDate != 0) {
                Date wPlannedDateConverted = new Date(wPlannedDate);
                dteBeginOrWaitingItem = convertDate(0, 0, wPlannedDateConverted);
                dteEndOrWaitingItem = convertDate(orWaitinglist.getWDuration().intValue(), orWaitinglist.getWAdditionalTime().intValue(), wPlannedDateConverted);
            }
            reason = orWaitinglist.getWDescription();
            DefaultScheduleEvent newResourceEvent = new DefaultScheduleEvent(reason, dteBeginOrWaitingItem, dteEndOrWaitingItem, orWaitinglist);
            newResourceEvent.setStyleClass("waitingitem");
            eventResourceAvailPerDay.addEvent(newResourceEvent);
        }
     }
    catch(java.util.EmptyStackException Ex)
    {
        System.out.println(Ex.getMessage());
    }


public static Date convertDate(Integer wDuration, Integer wAdditionalTime, Date availDate)
{
    Calendar cal = Calendar.getInstance();
    Integer wAdditionalTimeHours, wAdditionalTimeMinutes;
    Integer wDurationHours, wDurationMinutes;

    if(wAdditionalTime != 0 || wDuration != 0) {
        if (wAdditionalTime !=0) {
            wAdditionalTimeHours = (int) Math.floor (wAdditionalTime / 60);
            wAdditionalTimeMinutes = wAdditionalTime - (wAdditionalTimeHours * 60);
            cal.setTime(availDate);
            cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
            cal.add(Calendar.MINUTE, wAdditionalTimeMinutes);
            cal.add(Calendar.HOUR_OF_DAY, wAdditionalTimeHours);
        }
        if (wDuration != 0) {
            wDurationHours = (int) Math.floor (wAdditionalTime / 60);
            wDurationMinutes = wAdditionalTime - (wDurationHours * 60);
            cal.setTime(availDate);
            cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
            cal.add(Calendar.MINUTE, wDurationMinutes);
            cal.add(Calendar.HOUR_OF_DAY, wDurationHours);
        }
    } else {
        cal.setTime(availDate);
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
    }
    return cal.getTime();
}

模型更新:

<property name="WPlannedDate" type="timestamp">
  <column length="7" name="W_PLANNED_DATE">
    <comment>Planned date</comment>
  </column>
</property>

3 个答案:

答案 0 :(得分:2)

java.sql.Date不会返回时间组件,您应该在创建预备语句时使用java.util.Date或者您正在查询数据库的任何其他方式。

编辑:  将java.util.Date与sql查询一起使用可能会很棘手,因为查询会期望java.sql.Date。它在春天适合我。如果您不想使用它,那么您也可以使用java.sql.Timestamp。

见以下文件:

  

8.3.12 DATE,TIME和TIMESTAMP

     

有三种与时间相关的JDBC类型:

     

JDBC DATE类型表示由日,月和日组成的日期   年。相应的SQL DATE类型在SQL-92中定义,但它是   仅由主要数据库的子集实现。一些数据库   提供支持类似语义的替代SQL类型。 JDBC   TIME类型表示由小时,分钟和秒组成的时间。   相应的SQL TIME类型在SQL-92中定义,但它是   仅由主要数据库的子集实现。与DATE一样,   一些数据库提供支持类似的替代SQL类型   语义。 JDBC TIMESTAMP类型表示DATE加TIME加上a   纳秒场。相应的SQL TIMESTAMP类型定义于   SQL-92,但它只由极少数实现   数据库。因为标准Java类java.util.Date没有   完全匹配这三种JDBC日期/时间类型中的任何一种(包括   JDBC定义了DATE和TIME信息但没有纳秒   java.util.Date的三个子类对应于SQL类型。   他们是:

     

java.sql.Date for SQL DATE信息。小时,分钟,秒和   应将java.util.Date基类的毫秒字段设置为   零。如果提供给java.sql.Date的毫秒数   构造函数为负数,驱动程序将计算日期为   1970年1月1日之前的毫秒数。否则,日期是   计算为1月1日后指定的毫秒数,   1970。

     

用于SQL TIME信息的java.sql.Time。年,月和日   java.util.Date基类的字段设置为1970年1月和   这是Java时代的“零”日期。 SQL TIMESTAMP信息的java.sql.Timestamp。该类通过添加扩展java.util.Date   一个纳秒的字段。

答案 1 :(得分:0)

编辑:如果您使用.xml for hibernate更改类型为timestamp而不是date。 <property name="yourdate" column="YOUR_DATE" type="timestamp" /> 因此,您有时间在您的数据库上,并可以使用simpledateformat

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy-HH:mm");
dateFormat.format(orWaitinglist.getWPlannedDate());

答案 2 :(得分:0)

应使用java.sql.Date而不是java.sql.Timestamp,而不是DATE。 oracle类型TIMESTAMP等同于JDBC和SQL标准类型get/setDate

当使用其中一个{{1}}方法时,JDBC规范要求驱动程序排除时间部分。