{
PreparedStatement stm=con.prepareStatement("insert into message values(?,?,?,?,?)");
stm.setString(1,trans(msg.getTitle()));
stm.setString(2,trans(msg.getName()));
stm.setDate(3,new java.sql.Date(new java.util.Date().getTime()));
if((msg.getEmail()).length()==0)
stm.setString(5,null);
else stm.setString(5,trans(msg.getEmail()));
stm.setString(4,trans(msg.getContent()));
加粗的语句设置当前时间存入数据库,但数据库里是(10-七月 -2008 12:00:00 AM)这样,年月日是对的,但时间不对,jsp读出的 时间是2008-7-10 0:00:00 ,如何解决,谢谢!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【zhizhuo89】截止到2008-07-11 09:55:30的历史汇总数据(不包括此帖):
    发帖的总数量:12                       发帖的总分数:180                      每贴平均分数:15                       
    回帖的总数量:14                       得分贴总数量:1                        回帖的得分率:7%                       
    结贴的总数量:10                       结贴的总分数:140                      
    无满意结贴数:3                        无满意结贴分:60                       
    未结的帖子数:2                        未结的总分数:40                       
    结贴的百分比:83.33 %               结分的百分比:77.78 %                  
    无满意结贴率:30.00 %               无满意结分率:42.86 %                  
    楼主加油
      

  2.   

    你的数据库是什么数据库?建议,不要这么设置创建时间,这个参数也不要由程序来控制,而是在sql中,例如,你要插入时间insert into message values(?,?,sysdate,?,?) 这个就是oracle的时间,SQL SERVER等都有获取数据库时间专用的方法,很好掌握的。
      

  3.   

    create table message(title varchar(100),name varchar(20),time date default systimestamp,content varchar(2000),mail varchar(50));
    上述为建表的语句。
    楼上的说的我还是不明白。
      

  4.   

    还有一点你需要注意 
    java.sql.Date 为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。 就说他的分钟,秒全部处理成0了,当然不对了。即使你要用应该用 java.sql.Time。
      

  5.   

    你数据里的那个存时间字段是什么类型的?
    你先就得到的时间formate下.
      

  6.   

    楼主用的stm.setDate(3,new java.sql.Date(new java.util.Date().getTime())); setDate会省略掉后面的小时,分,秒 应该使用setTimestamp
      

  7.   

    我看了一下,你用的就是Oracle,你的代码可以这么写
    PreparedStatement stm=con.prepareStatement("insert into message values(?,?,sysdate,?,?)"); 
    stm.setString(1,trans(msg.getTitle())); 
    stm.setString(2,trans(msg.getName())); 
    //stm.setDate(3,new java.sql.Date(new java.util.Date().getTime())); 
    if((msg.getEmail()).length()==0) 
    stm.setString(4,null); 
    else stm.setString(4,trans(msg.getEmail())); 
    stm.setString(3,trans(msg.getContent())); 看见没有,第三个参数我使用sysdate,这个会自动返回数据库的本地时间,很方便。
      

  8.   

    我试了,数据无法添加到数据库中,是否需要修改表。谢谢;
    create table message(title varchar(100),name varchar(20),time date ,content varchar(2000),mail varchar(50)); 
      

  9.   

    你表创建好之后,你可以用sql语句直接带上参数试一试能不能插入,再放到程序中去吧
      

  10.   

    楼主是需要将 Web服务器时间 还是 DB服务器时间 插入数据库?
      

  11.   

    同一时刻: 
    SQL> select sysTimestamp from dual; SYSTIMESTAMP  //当前系统时间 
    ----------------------------------------- 
    11-7月 -08 11.05.56.593000 上午 +08:00 语句如下: 

    PreparedStatement stm=con.prepareStatement("insert into message values(?,?,?,?,?)"); 
    stm.setString(1,trans(msg.getTitle())); 
    stm.setString(2,trans(msg.getName())); 
    stm.setTimestamp(3,new Timestamp(new java.util.Date().getTime())); … 
     
    jsp添加到数据库的表里显示而为11-七月 -2008 03:03:48 AM (两个时分秒不统一)
    请高手指教! 
      

  12.   

    如果你使用的数据库Date类型跟Java的格式不一致或者你觉得转换比较麻烦的话,你可以把数据库Date类型存储字段改成String型,这样统一用java.util.Date就不会出错,不过好像你现在也不好改数据库结构了所以建议你还是先整清楚数据库的date类型支持什么格式好了,我觉得一般对Java的date类型都是能够解析出来的,你使用的什么数据库能说说么
      

  13.   

    实际上就像14楼问的这样,楼主的问题需要区别处理:
    首先要确认oralce的数据类型是DATE型1.如果要插入的时间是DB服务器的系统时间,那么很简单,第三个参数不需要写?来set,直接用sysdate这个oracle自带的函数就可以(补充一点,你另外一个帖子写的getDate函数是SQL Server的,不是oracle的)PreparedStatement stm=con.prepareStatement("insert into message values(?,?,sysdate,?,?)");这样写就可以在DATE型插入当前DB服务器的时间。2.如果需要插入的是WEB服务器的时间,那么首先你要知道你的这些代码是运行在WEB服务器上的,new Date()的时候,取得的是当前WEB服务器的时间。
    然后要知道的是你用的PreparedStatement是一个接口,PreparedStatement.setDate()这个方法由Oracle厂家实现,setDate()插入数据库的只是年月日,无视了时分秒,要包含时分秒的话,用PreparedStatement.setTimestamp(3,new java.sql.Timestamp(System.currentTimeMillis()));System.currentTimeMillis()和new java.util.Date().getTime()是一样的,都是运行这段代码的WEB服务器的时间。btw:关于PreparedStatement接口的实现,如果你想知道更多的话,用winrar或者zip打开oracle目录的oracle\ora92\jdbc\lib\ojdbc14.jar这个文件,可以看到里面的class结构,安装DJ Java Decompiler反编译工具可以看到具体代码。另外,你16楼所说的两个时间不一致的问题,一个原因明显是第一个时间是DB服务器的,第二个是WEB服务器的,还有一个时分秒不统一的原因应该是两台机器的时区设定问题,小时刚好差8,这个可以具体调查。
      

  14.   

    linux可以硬件时间和操作系统时间不一样的 unix应该也存在 不知道你这个和这个有没有关系
      

  15.   

    to:17楼,18楼,谢谢!
    你们说的很明白,我还是很疑惑。
    我现在把数据库的date类型改成String,建表语句如下:create table message(title varchar(100),name varchar(20),time varchar(50),content varchar(2000),mail varchar(50));
    写入数据库java:
     {
      java.util.Date date=new java.util.Date(); 
      String datetime=new Timestamp(date.getTime()).toString(); //当前的web时间转换为String
      PreparedStatement stm=con.prepareStatement("insert into message values(?,?,?,?,?)");
      stm.setString(1,trans(msg.getTitle()));
      stm.setString(2,trans(msg.getName()));
      stm.setString(3,datetime); 
       ………………
    这样的语句插入数据库表里显示的时间与当前系统(new java.util.Date())时间差8小时,另外,new java.util.Date()得到的时间,与我电脑上的时间不一致,原因?如何修改?
      

  16.   

    To:17楼
    对了,使用的平台是oracle9i+Tomcat5.5+jdk1.5
      

  17.   

    我不是很明白,两台仪器是指什么,DB服务器和WEB服务器的时间统一了,而它们与我的电脑系统的时间不一样了。谢谢!
      

  18.   


    new java.util.Date()得到的时间,与我电脑上的时间不一致是差8小时么,是的话应该是时区问题,双击你右下角时间确认一下时区是GMT+8
    还有System.out.println(TimeZone.getDefault().getDisplayName()); 确认跟系统一致
    或者baidu一下"java 时区"
      

  19.   

    insert into message values(?,?,TO_CHAR(SYSDATE, 'YYYYMMDD'),?,?)oracle 有你想要的时间格式哈 你自己可以选择的
      

  20.   

    1.是8小时,时区是GMT+8
    2.System.out.println(TimeZone.getDefault().getDisplayName());
    在jdk输出的是“格林威治时间”。
    是时间格式不一样,如何统一,如何baidu一下"java 时区" ?
    麻烦那么多,真不好意思。
      

  21.   

     在Oracle9i之前,虽然有一个NEW_TIME函数可以改变DATE的时间戳部分,但是还没有专门用来存储时区信息的数据类型。在Oracle9i中,我们可以使用DBTIMEZONE伪字段查询数据库的时区,使用SESSIONTIMEZONE伪字段查询会话的时区。  但是,对于大多数数据库,这些值都是-07:00之类的偏移值,因此对于NEW_TIME函数是没有用的。Oracle9i有关NEW_TIME的文档建议使用FROM_TZ来替代,但是这可能会产生误导。FROM_TZ只将一个时区应用到一个时间戳上;它并不能把一个时区转换成另外一个时区。  其实有一个比较好的方法(从文档中得到这个方法可能有点难)。首先,为了完成这个工作,在正确的时区内需要一个TIMESTAMP WITH ZONE数据类型。然后,如果你将关键字AT TIME ZONE应用到那个值,它就会自动地调整为新的时区和日期。select (timestamp '2003-04-06 01:59:59' at time zone 'PDT') 
    at time zone 'GMT'
    from dual;
    06-APR-03 08.59.59.00000000 AM GMT 
      这个语句将为太平洋白天时间(即其切换到PST之前的时刻)构造一个TIMESTAMP WITH TIME ZONE然后再将其转换到GMT.AT TIME ZONE关键字也接受默认的偏移值语法:select (timestamp '2003-04-06 02:00:00' 
    at time zone '-07:00') at time zone
    '00:00' from dual;
    06-APR-03 09.00.00.000000000 AM +00:00 
      你还可以使用伪字段来自动调整当前会话的时区:  selectcurrent_timestamp at time zone dbtimezone from dual;  上面的表达式返回一个当前会话的本地时间(数据类型为时区),重新调整数据库的时区,调整后的时区将与SYSTIMESTAMP的结果相等。  有了以上的这些信息,就可以构造一个比较好的NEW_TIME函数:create or replace function my_new_time
    (
    p_dwtz timestamp with time zone,
    p_tz varchar2
    ) return date
    is
    begin
    return cast(p_dwtz at time zone p_tz as date);
    end my_new_time;
    /
    show errors;
    select my_new_time(sysdate,'+08:00') from dual; 
      即使第一个参数被标记为一个timestamp with time zone,你依然可以传入一个TIMESTAMP和DATE,这样由于Oracle的自动转型操作,得到的时间将是会话在本地时区的当前时间。这个函数接受包括偏移值在内的任何可以被TIMESTAMP识别的时区,然后将接受的时区调整为正确的值。不明白?
      

  22.   

     
    问题描述:Window XP 系统自己能够读取正确的时间,但是用java获取的时间始终与北京时间相差八个小时。 
    原因分析: 
    1.系统本身时区设置错误(可以排除,上面已经交代系统能够获取正确时间) 
    2.注册表出现异常。 
    注册表对应项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 
    解决之道: 
    1.备份Time Zones这一项 
    2.从正常的并且是相同系统的机器中导出该项,然后倒入到自己机器中 我用第二种办法,搞定!!但不知道对以后有什么影响!!谢谢各位。买单!