Java、数据库中Date及DateTime详解

1、java.sql.Date和java.util.Date区别及使用

可见这三个类都是java.utl.Date的子类。

java.sql.Date就是与数据库Date相对应的一个类型(数据库操作),而java.util.Date是纯java的Date。

详细查看java.sql.Date类:

一个包装了毫秒值的瘦包装器 (thin wrapper),它允许 JDBC 将毫秒值标识为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。

为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将小时、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。 

import java.text.SimpleDateFormat;

public class Test {

	public static void main(String[] args) throws Exception {

		java.util.Date nowUtil = new java.util.Date(); // java.util.Date
		java.sql.Date nowSql = new java.sql.Date(System.currentTimeMillis());// java.sql.Date
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(format.format(nowUtil));// 格式化 输出
		System.out.println(format.format(nowSql));// 格式化 输出
		System.out.println(nowUtil); // 直接 输出
		System.out.println(nowSql); // 直接 输出
	}
}

代码输出结果:

2019-07-28 12:00:16
2019-07-28 12:00:16
Sun Jul 28 12:00:16 CST 2019
2019-07-28 

日期格式

“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被截取

也就是说,如果你是 2017-09-17 15:15:25 这样的时间点存取数据,那么存在数据库中的值就是:2017-09-17 00:00:00

类型转换

那么如果把java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的java.sql.Date规范化,非规范化的部分将会被劫取。然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).
显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值,
我们需要利用java.sql.Timestamp.

而java.util.Date 与 java.sql.Date的转换:

设sqltime是java.sql.Date类型对象、utiltime是java.util.Date类型对象

(1)java.util.Date 转 java.sql.Date:

这也就是下转型,需要造型,但是由于时间格式不一样,需要以毫秒的形式进行转换:

java.sql.Date s = new java.sql.Date(util.getTime());

 (2)java.sql.Date 转 java.util.Date: 

这是上转型,会自动转换:

java.util.Date u = sqltime;

也如:

java.sql.Date s = new java.sql.Date(new Date().getTime()); 注意,new Date();是java.util.Date类型

java.util.Date u = s;

2、Date,DateTime,String等日期格式的相互转化 

日期之间的转化关系:

(1)获取当前系统时间
Date date = new Date();

(2)Date转为DateTime
DateTime dateTime = new DateTime(date.getTime());

(3)DateTime转为Date
Date date = dateTime.toDate();

(4)获取日期格式
   DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

(5)Date转换为String类型格式
   String dateStr = df.format(new Date());

3、获取当前时间

(1)获取当前时间(日期+时间)

获得系统当前时间(date类型)
Date date = new Date();
//转换成指定格式的字符串(String类型)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss");
String currentTime = sdf.format(date);
//当前系统时间:2015-09-09  16:08:33(String类型)
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = sdf.format(new Date());

获得系统当前时间(date类型)
Date date = new Date();
或者
java.util.Date date = new java.util.Date();
转换成指定格式的字符串(String类型)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss");
或者
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String currentTime = sdf.format(date);

(2)获取当前日期

//获得系统当前日期(date类型)
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(sdf.format(new Date()));
//获得系统当前日期(String类型)
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String currentTime = sdf.format(new Date());

4、格式转换常用方法 

/*
 * 返回当前日期时间字符串
 * 默认格式:yyyy-mm-dd hh:mm:ss
 * @return String 返回当前字符串型日期时间
 */
public static String getCurrentTime() {
    String dateStr = null;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = new Date();
    dateStr = sdf.format(date);
    return dateStr;
}
/**
 * 返回当前日期时间字符串
 * 默认格式:yyyymmddhhmmss
 * @return String 返回当前字符串型日期时间
 */
public static BigDecimal getCurrentTimeAsNumber() {
    String dateStr = null;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    Date date = new Date();
    dateStr = sdf.format(date);
    return new BigDecimal(dateStr);
}
/**
 * 返回自定义格式的当前日期时间字符串
 * @param format
 *            格式规则
 * @return String 返回当前字符串型日期时间
 */
public static String getCurrentTime(String format) {
    String dateStr = null;
    SimpleDateFormat sdf = new SimpleDateFormat(format);
    Date date = new Date();
    dateStr = sdf .format(date);
    return dateStr ;
}
/**
 * 返回当前字符串型日期
 * @return String 返回的字符串型日期
 */
public static String getCurDate() {
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd");
    String strDate = simpledateformat.format(calendar.getTime());
    return strDate;
}
/**
 * 返回指定格式的字符型日期
 * @param date
 * @param formatString
 * @return
 */
public static String Date2String(Date date, String formatString) {
    if (G4Utils.isEmpty(date)) {
        return null;
    }
    SimpleDateFormat simpledateformat = new SimpleDateFormat(formatString);
    String strDate = simpledateformat.format(date);
    return strDate;
}
/**
 * 返回当前字符串型日期
 * @param format
 *            格式规则
 * @return String 返回的字符串型日期
 */
public static String getCurDate(String format) {
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat simpledateformat = new SimpleDateFormat(format);
    String strDate = simpledateformat.format(calendar.getTime());
    return strDate;
}
/**
 * 返回TimeStamp对象
 * @return
 */
public static Timestamp getCurrentTimestamp() {
    Object obj = TypeCaseHelper.convert(getCurrentTime(), "Timestamp", "yyyy-MM-dd HH:mm:ss");
    if (obj != null)
        return (Timestamp) obj;
    else
        return null;
}
/**
 * 将字符串型日期转换为日期型
 * @param strDate
 *            字符串型日期
 * @param srcDateFormat
 *            源日期格式
 * @param dstDateFormat
 *            目标日期格式
 * @return Date 返回的util.Date型日期
 */
public static Date stringToDate(String strDate, String srcDateFormat, String dstDateFormat) {
    Date rtDate = null;
    Date tmpDate = (new SimpleDateFormat(srcDateFormat)).parse(strDate, new ParsePosition(0));
    String tmpString = null;
    if (tmpDate != null)
        tmpString = (new SimpleDateFormat(dstDateFormat)).format(tmpDate);
    if (tmpString != null)
        rtDate = (new SimpleDateFormat(dstDateFormat)).parse(tmpString, new ParsePosition(0));
    return rtDate;
}

 https://blog.csdn.net/jingsong2015/article/details/77714780

MySQL中的date和datetime

MySQL 的日期类型有5个,分别是: date、time、year、datetime、timestamp。 

类型 字节 格式 用途 是否支持设置系统默认值 范围
date 3 YYYY-MM-DD 日期值 不支持 1000-01-01/9999-12-31
time 3 HH:MM:SS 时间值或持续时间 不支持 '-838:59:59'/'838:59:59'
year 1 YYYY 年份 不支持 1901/2155
datetime 8 YYYY-MM-DD HH:MM:SS 日期和时间混合值 不支持 1000-01-01 00:00:00/9999-12-31 23:59:59
timestamp 4 YYYYMMDD HHMMSS 混合日期和时间,可作时间戳 支持

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,

北京时间 2038-1-19 11:14:07

格林尼治时间 2038年1月19日 凌晨 03:14:07

在Mysql数据库中日期跟时间的我知道有两种,一种是date类型,还有一种是datetime类型

1、date

date类型也就是我们常见的储存yyyy-MM-dd类型的日期,它不能储存时间,也就是只能储存日期

类型可用于需要一个日期值而不需要时间部分时。MySQL 以YYYY-MM-DD格式检索与显示date值。

支持的范围则是:‘1000-01-01’ 到 ‘9999-12-31’

2、datetime

dateitme类型可用于需要同时包含日期和时间信息的值,不过是连在一起的。MySQL 以:YYYY-MM-DD HH:MM:SS

格式检索与显示 datetime类型。支持的范围是:‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’。

(“支持”的含义是,尽管更早的值可能工作,但不能保证他们均可以。)

 

使用这两行代码转换时间后,就可以往数据库插入”yyyy-MM-dd HH:mm:ss“类型.

Timestamp对象也是继承了Date类 

3、与java数据的交互

java中的date(java.util.Date)将日期和时间都可以记下来,那么如果想在mysql中存储日期和时间,也就是用datetime,而在数据中应该如何对应呢?

使用hibernate测试,发现当把mysql数据库中设置了datetime,反向工程生成的hbm.xml文件中,使用的是timestamp,如下:

反向生成javapojo时,生成的还是Date

由此可见对于mysqldatetime,与java中的date,如果要使二者正确交互,中间要使用timestamp

java.util.Date date = new java.util.Date();    // 获取一个Date对象
/*或者*/Date date = new Date();
Timestamp timeStamp = new Timestamp(date.getTime()); //将日期时间转换为数据库中的timestamp类型

再用setTimestamp()设置数据库中的“日期+时间”。

这样放入数据库的就是“yyyy-mm-dd hh:mm:ss”格式的数据。

注意,mysql中如果使用date而不是datetime是保存不下“日期+时间”的,只能保存“时间”

具体应用:

PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
	Timestamp timestamp = rs.getTimestamp("action_time");
	Date date = new Date(timestamp.getTime());
	String dateStr = dateUtil.dateString(date);
}
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
    //将Date转换成String
    public String dateString(Date date) {
	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	    String dateStr = sdf.format(date);
	    return dateStr;
    }
    //将Timestamp转换成String
    public String timeString(Timestamp timestamp) {
	    Date date = new Date(timestamp.getTime());
	    String dateStr = dateString(date);  
	    return dateStr;
    }
}

date类型的错误

1、java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp

在使用MySql 时, 数据库中的字段类型是timestamp的,默认为0000-00-00, 会发生异常:java.sql.SQLException:   Value   '0000-00-00 '   can   not   be   represented   as   java.sql.Timestamp

 “0000-00-00 00:00:00”在mysql中是作为一个特殊值存在的

但 java.sql.Date 将其视为 不合法的值 格式不正确因此产生异常

https://blog.csdn.net/zhuzj12345/article/details/84333672

https://blog.csdn.net/demon7639/article/details/52540367

https://blog.csdn.net/u010773667/article/details/51014306

https://blog.csdn.net/QH_JAVA/article/details/48399711

https://www.cnblogs.com/diffx/p/9994019.html

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(MySQL数据库,Java学习,Java,Web后端开发,Oracle数据库)