可见这三个类都是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.
设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;
日期之间的转化关系:
(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());
获得系统当前时间(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);
//获得系统当前日期(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());
/*
* 返回当前日期时间字符串
* 默认格式: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 的日期类型有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类型
date类型也就是我们常见的储存yyyy-MM-dd类型的日期,它不能储存时间,也就是只能储存日期
类型可用于需要一个日期值而不需要时间部分时。MySQL 以YYYY-MM-DD格式检索与显示date值。
支持的范围则是:‘1000-01-01’ 到 ‘9999-12-31’。
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
类
java中的date(java.util.Date)将日期和时间都可以记下来,那么如果想在mysql中存储日期和时间,也就是用datetime,而在数据中应该如何对应呢?
使用hibernate测试,发现当把mysql数据库中设置了datetime,反向工程生成的hbm.xml文件中,使用的是timestamp,如下:
反向生成java的pojo时,生成的还是Date。
由此可见对于mysql中datetime,与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;
}
}
在使用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