首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 数据库的时间问题? [已结贴,结贴人:zhizhuo89]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 09:55:31 楼主
    {
    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 ,如何解决,谢谢!
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 09:55:351楼 得分:0
    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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 %                 
    楼主加油
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 09:57:112楼 得分:0
    转换时间格式为2008-7-10 0:00:00 样的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:02:243楼 得分:5
    你的数据库是什么数据库?

    建议,不要这么设置创建时间,这个参数也不要由程序来控制,而是在sql中,例如,你要插入时间insert into message values(?,?,sysdate,?,?) 这个就是oracle的时间,SQL SERVER等都有获取数据库时间专用的方法,很好掌握的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:05:304楼 得分:0
    create table message(title varchar(100),name varchar(20),time date default systimestamp,content varchar(2000),mail varchar(50));
    上述为建表的语句。
    楼上的说的我还是不明白。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:05:355楼 得分:5
    还有一点你需要注意
    java.sql.Date 为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。

    就说他的分钟,秒全部处理成0了,当然不对了。即使你要用应该用 java.sql.Time。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:05:466楼 得分:0
    你数据里的那个存时间字段是什么类型的?
    你先就得到的时间formate下.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:06:567楼 得分:0
    你用的是Oracle数据库吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:07:158楼 得分:10
    楼主用的stm.setDate(3,new java.sql.Date(new java.util.Date().getTime()));

    setDate会省略掉后面的小时,分,秒

    应该使用setTimestamp
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:07:419楼 得分:0
    楼主真有分
    发2次都100分
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:08:1810楼 得分:0
    oracle9i数据库!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:09:1611楼 得分:30
    我看了一下,你用的就是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,这个会自动返回数据库的本地时间,很方便。


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:39:1012楼 得分:0
    引用 11 楼 lovingprince 的回复:
    我看了一下,你用的就是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.getEmai…

    我试了,数据无法添加到数据库中,是否需要修改表。谢谢;
    create table message(title varchar(100),name varchar(20),time date ,content varchar(2000),mail varchar(50));
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:41:4713楼 得分:0
    你表创建好之后,你可以用sql语句直接带上参数试一试能不能插入,再放到程序中去吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 10:55:0214楼 得分:0
    楼主是需要将 Web服务器时间 还是 DB服务器时间 插入数据库?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-11 11:05:5915楼 得分:0
    时间格式,要是就一种就好了,每次都要多考虑时间问题,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 10:00:5916楼 得分:0
    同一时刻:
    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 (两个时分秒不统一)
    请高手指教!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 10:14:1817楼 得分:5
    如果你使用的数据库Date类型跟Java的格式不一致或者你觉得转换比较麻烦的话,你可以把数据库Date类型存储字段改成String型,这样统一用java.util.Date就不会出错,不过好像你现在也不好改数据库结构了

    所以建议你还是先整清楚数据库的date类型支持什么格式好了,我觉得一般对Java的date类型都是能够解析出来的,你使用的什么数据库能说说么
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 11:31:2818楼 得分:20
    引用 14 楼 sagezk 的回复:
    楼主是需要将Web服务器时间还是DB服务器时间插入数据库?

    实际上就像14楼问的这样,楼主的问题需要区别处理:
    首先要确认oralce的数据类型是DATE型

    1.如果要插入的时间是DB服务器的系统时间,那么很简单,第三个参数不需要写?来set,直接用sysdate这个oracle自带的函数就可以(补充一点,你另外一个帖子写的getDate函数是SQL Server的,不是oracle的)
    Java code
    PreparedStatement stm=con.prepareStatement("insert into message values(?,?,sysdate,?,?)");

    这样写就可以在DATE型插入当前DB服务器的时间。

    2.如果需要插入的是WEB服务器的时间,那么首先你要知道你的这些代码是运行在WEB服务器上的,new Date()的时候,取得的是当前WEB服务器的时间。
    然后要知道的是你用的PreparedStatement是一个接口,PreparedStatement.setDate()这个方法由Oracle厂家实现,setDate()插入数据库的只是年月日,无视了时分秒,要包含时分秒的话,用
    Java code
    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,这个可以具体调查。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 11:36:3019楼 得分:0
    linux可以硬件时间和操作系统时间不一样的 unix应该也存在 不知道你这个和这个有没有关系
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 12:21:0820楼 得分:0
    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()得到的时间,与我电脑上的时间不一致,原因?如何修改?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 12:25:2321楼 得分:0
    To:17楼
    对了,使用的平台是oracle9i+Tomcat5.5+jdk1.5
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 12:30:3222楼 得分:0
    引用 18 楼 logi22 的回复:
    另外,你16楼所说的两个时间不一致的问题,一个原因明显是第一个时间是DB服务器的,第二个是WEB服务器的,还有一个时分秒不统一的原因应该是两台机器的时区设定问题,小时刚好差8,这个可以具体调查。

    我不是很明白,两台仪器是指什么,DB服务器和WEB服务器的时间统一了,而它们与我的电脑系统的时间不一样了。谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 13:36:1923楼 得分:20
    引用 20 楼 zhizhuo89 的回复:
    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()得到的时间,与我电脑上的时间不一致,原因?如何修改?


    new java.util.Date()得到的时间,与我电脑上的时间不一致

    是差8小时么,是的话应该是时区问题,双击你右下角时间确认一下时区是GMT+8
    还有System.out.println(TimeZone.getDefault().getDisplayName()); 确认跟系统一致
    或者baidu一下"java 时区"
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 14:17:5624楼 得分:5
    insert into message values(?,?,TO_CHAR(SYSDATE, 'YYYYMMDD'),?,?)

    oracle 有你想要的时间格式哈 你自己可以选择的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 15:27:2825楼 得分:0
    lovingprince 正解!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-15 11:12:5126楼 得分:0
    引用 23 楼 logi22 的回复:
    是差8小时么,是的话应该是时区问题,双击你右下角时间确认一下时区是GMT+8
    还有System.out.println(TimeZone.getDefault().getDisplayName()); 确认跟系统一致
    或者baidu一下"java 时区"

    1.是8小时,时区是GMT+8
    2.System.out.println(TimeZone.getDefault().getDisplayName());
    在jdk输出的是“格林威治时间”。
    是时间格式不一样,如何统一,如何baidu一下"java 时区" ?
    麻烦那么多,真不好意思。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-15 11:40:4927楼 得分:0
     在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识别的时区,然后将接受的时区调整为正确的值。

    不明白?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-15 12:35:1828楼 得分:0

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

    我用第二种办法,搞定!!但不知道对以后有什么影响!!谢谢各位。买单!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved