`

java和数据库时间类型

    博客分类:
  • java
阅读更多

表单提交过来,都是String类型,需要web框架来转换类型,比方说,时间类型的字符串,需要转换为java.util.Date类型。

 

java.util.Date的三种子类:java.sql下的DATE、TIME和TIMESTAMP

DATE:由日、月和年组成。

TIME:由小时、分钟和秒组成。 

TIMESTAMP:将DATE和TIME结合起来,并添加了纳秒域。

 

public static void main(String args[]) {
        java.util.Date a = new java.util.Date();
        System.out.println("java.util.Date:" + a);
        java.sql.Date b = new java.sql.Date(a.getTime());
        System.out.println("java.sql.Date:" + b);
        java.sql.Time c = new java.sql.Time(a.getTime());
        System.out.println("java.sql.Time:" + c);
        java.sql.Timestamp d = new java.sql.Timestamp(a.getTime());
        System.out.println("java.sql.Timestamp:" + d);
    }

结果


  

JAVA字符串转日期或日期转字符串

用的API是SimpleDateFormat,它是属于java.text.SimpleDateFormat。

用法: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

PS:为什么有的格式大写有的格式小写?为了避免混淆。

MM是月份,mm是分;HH是24小时制,而hh是12小时制。

1.字符串转日期 

2008-07-10 19:20:00 要把它转成日期,可以用Date date = sdf.parse("2008-07-10 19:20:00");

2.日期转字符串 

假如把今天的日期转成字符串可用 String str = sdf.format(new Date());

这个字符串内容的格式类似2008-07-10 19:20:00

透过这个API我们便可以随心所欲的将日期转成我们想要的字符串格式,

例如希望将日期输出成2008年7月10日,我们可以这么写:

SimpleDateFormat sdf =   new SimpleDateFormat("yyyy年MM月dd日");

String str = sdf.format(new Date());

 

DateUtils时间类

import java.util.Date;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;

public class random {

    private static String format(Date date) {
        return DateFormatUtils.ISO_DATETIME_FORMAT.format(date);
    }
    public static void main(String[] args) {
        int amount = 2;
        Date date = new Date();
        System.out.println(format(date));
        System.out.println("增加amount年:" + format(DateUtils.addYears(date, amount)));
        System.out.println("增加amount月:" + format(DateUtils.addMonths(date, amount)));
        System.out.println("增加amount日:" + format(DateUtils.addDays(date, amount)));
        System.out.println("增加amount时:" + format(DateUtils.addHours(date, amount)));
        System.out.println("增加amount钟:" + format(DateUtils.addMinutes(date, amount)));
        System.out.println("增加amount秒:" + format(DateUtils.addSeconds(date, amount)));
        System.out.println("增加amount毫秒:" + format(DateUtils.addMilliseconds(date, amount)));
        System.out.println("增加amount星期:" + format(DateUtils.addWeeks(date, amount)));
        System.out.println("比较两个日期对象的日期部分是否相等:" + DateUtils.isSameDay(date, new Date()));
        System.out.println("比较两个日期对象是否完全相等,精确到毫秒:"+DateUtils.isSameInstant(date, new Date()));
    }
}
结果:

 Calendar

public class random {

    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH) + 1;
        int date = c.get(Calendar.DATE);
        System.out.println("今天是" + year + "年" + month + "月" + date + "日");
        System.out.println("是今年的第" + c.get(Calendar.DAY_OF_YEAR) + "天");
        System.out.println("c.getTime()的结果: " + c.getTime());
        System.out.println("new Date()的结果: " + new Date());
        c.set(Calendar.DAY_OF_YEAR, 30);
        System.out.println("2015年的第30天是" + c.getTime());
        System.out.println("两天后的结果:" + getDateAfter(new Date(), 2));
        System.out.println("两天前的结果:" + getDateBefore(new Date(), 2));
    }

    public static Date getDateBefore(Date d, int day) {
        Calendar now = Calendar.getInstance();
        now.setTime(d);
        now.set(Calendar.DATE, now.get(Calendar.DATE) - day);
        return now.getTime();
    }

    public static Date getDateAfter(Date d, int day) {
        Calendar now = Calendar.getInstance();
        now.setTime(d);
        now.set(Calendar.DATE, now.get(Calendar.DATE) + day);
        return now.getTime();
    }
} 
结果:
注意:int month=c.get(Calendar.MONTH)+1哦,好像系统是从0开始计月份,到了12月就归零了。所以单独取月份时,要在后面加一才能得到当前的月份。
Calendar和Date的转化
 
(1) Calendar转化为Date
Calendar cal=Calendar.getInstance();
Date date=cal.getTime();
 
(2) Date转化为Calendar
Date date=new Date();
Calendar cal=Calendar.getInstance();
cal.setTime(date);
系统当前时间精确到分
Date now=new Date();
Calendar cal1 = Calendar.getInstance(); 
cal1.setTime(now); 
cal1.set(Calendar.SECOND, 0); 
now = cal1.getTime();
System.out.println(now);
 

比方说要查询截止日22号的,必须把22号的所有询价单都查出来。

方案一  把数据库字段转成to_char,然后只比较年月日,这样可以把当天的所有记录都查出来。

<![CDATA[to_char(i.con_to_account_date,'yyyy-mm-dd') >= to_char(#{expiringDateBegin},'yyyy-mm-dd') and to_char(i.con_to_account_date,'yyyy-mm-dd') <= to_char(#{expiringDateEnd},'yyyy-mm-dd')]]>

这样会走全表扫描。

 

方案二:

把页面精确到天java.util.Date的附加上23:59:59,直接比较数据库时间。

String date="2015-1-22";

Date dates = DateUtil.parseStdDate(date);

int amount=1;

Date dates1 =DateUtils.addDays(dates, amount);  //加一天

Date dates2 =DateUtils.addSeconds(dates1,-1);   //减一秒

System.out.println(DateUtil.formateDatetime(dates2))

 

数据库时间类型

 mysql(版本:5.1.50)的时间日期类型如下:

datetime 8bytes xxxx-xx-xx xx:xx:xx 1000-01-01 00:00:00到9999-12-31 23:59:59

timestamp 4bytes xxxx-xx-xx xx:xx:xx 1970-01-01 00:00:01到2038

date 3bytes xxxx-xx-xx 1000-01-01到9999-12-31

year 1bytes xxxx 1901到2155

time 3bytes xx:xx:xx -838:59:59到838:59:59(为了满足时间的加减运算)

------------------------------------------------------------------------

java(1.6) 中能保存时间日期类型的类主要有

java.util.Date

java.util.Calendar

java.sql.Date

java.sql.Time

java.sql.Timestamp

 

java提供与mysql方便交互的三种数据类型

java.sql.Date

java.sql.Time

java.sql.Timestamp

它们都是继承java.util.Date,算是对该类的精简,很适合跟数据库交互。

 

===========java注入数据库==========

java类型   mysql类型        成功与否

date         date               yes

date         time               no

date         timestamp       no

date         datetime         no

 

time         date               no

time         time               yes

time         timestamp       no

time         datetime         no

 

timestamp date              yes

timestamp time              yes

timestamp timestamp     yes

timestamp datetime        yes

==========end java注入数据库========

总规律,如果A完全包含B,则A可以向B注入数据,否则报错

 

==========从数据库提取到java ==========

mysql类型    java类型     成与否

date             date         yes

date             time         yes --------------缺少的部分使用历元

date           timestamp   yes --------------缺少的部分使用历元 

 

time           date           yes --------------缺少的部分使用历元

time           time           yes

time          timestamp    yes --------------缺少的部分使用历元

 

timestamp date           yes

timestamp time           yes

timestamp timestamp   yes

 

datetime      date         yes

datetime      time         yes

datetime    timestamp   yes

==========end 从数据库提取到java=======

不会出错,缺少的部分使用历元,而不是当前日期时间

 

以前从mysql中查询出来的时间日期类型,都放在java.util.Date类型里面了。

这样带来一系列的问题,首先这个类提供的时间操作函数太少,一般都需要转换成java.util.Calendar再去操作;

其次即使使用了java.util.Calendar,也不是很方便,一个很简单的想法,需要写很多代码才能实现;

java.util.Date的数据内容为xxxx-xx-xx xx:xx:xx,有时候不需要时间,只需要日期。

从数据库中取值出来的日期类型放到这个类中的时候,会在时间位自动补上当前时间。这使得本来两个日期在数据库中是相等的,取出来放到这个类得时候就不再相等了,需要去考虑时间上的误差。

 

java.util.Date时间系统的运算系列

after,before

compareTo原小于参数返回<0,等于返回=0,大于返回>0

 

优点:于数据库同类型,可以方便传输(无论是从DB到src还是反方向),方便比较大小

缺点:缺少运算单元,不适合时间跳跃的运算和间隔的运算

 

总结:calendar具有强大的跳跃运算和间隔运算能力,在需要的时候,可以将sql系列的时间转成calendar。

先设置calendar为历元,然后从sql系列时间中转换,最后再转回sql系列时间。

calendar只用于时间有跳跃的转换,对比运算统一使用sql系统,这样代码将更清晰

 

 

 

 

 

 

 

  • 大小: 6.6 KB
  • 大小: 5.8 KB
  • 大小: 3.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics