今天突然笔试到一道关于时间操作的题目,认为会很简单,可是写着写着突然懵逼了~~~,关键是到java8发生了很大的改变,jiji~~~
1、java.util 包下
Class Date
在软件三层架构(在ui层和逻辑层应该使用java.util.Date,在持久层需要使用java.sql.Date)
java.util.Date 即包含日期、又包含时间
2、java.sql 包下
Class Date
只有在持久层即dao层,才能使用java.sql.Date,在其它层不能出现java.sql包下的内容
java.sql.Date 只进行日期的操作
注:它的父类是java.util.Date
3、java.sql 包下
Class Timestamp
java.sql.Timestamp 进行日期+时间的操作
4、java.util 包下
Class Calendar
5、java.text包下 (格式化输出)
Class SimpleDateFormat
好吧,比比这些似乎也没啥用,上代码干活吧~~~~~~
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main1 {
public static void main(String[] args) {
outUtilDate();
inputUtilDate();
}
//格式化输出时间
public static void outUtilDate(){
Date date = new Date(); //获取当前默认时间——年月日小时分秒
//SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sDateFormat = new SimpleDateFormat("MM/dd/yyyy"); //据说欧洲人喜欢的格式
String aa = sDateFormat.format(date);
System.out.println(aa);
}
//格式化输入
public static void inputUtilDate(){
String aa = "2018-9-12";
SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sDateFormat.parse(aa); //时间运算都是以对象为准
System.out.println(date.toString());
} catch (ParseException e) {
e.printStackTrace();
}
}
}
运行结果:
第一个是正常人想看到的结果;
第二个是把输入的正常格式转换成默认的标准格式。。。。
先看一下它们之间的关系,util.Date对sql.Date说:我是你爸爸,sql.Date说:嗷嗷~~~
好了此时应该想到父转子,子转父的问题:
前方预警——子转父是安全的,因为“子”所指向的空间要大于“父”所指的空间,儿子的东西比爹的东西多,正所谓长江后浪推前浪,把你爹拍在沙滩上!!!
即 sql----》util 可以平滑的转:
java.util.Date birthday = new java.sql.Date(233333);
那么问题来了,我们什么时候子转父嘞?
啦啦啦!!!从数据库里边取出来的日期——》由后面的持久层dao给(sql.Date)——》前面的逻辑层和ui层(util.Date)
注意,注意,注意:util.Date这爸爸还有个构造函数:
public Date(long date)
分配一个 Date
对象并将它初始化为代表指定的毫秒数自基准时间被称为“时代”,即1970年1月1日,00:00:00 GMT。
参数:date1970年1月1日以来的毫秒,00:00:00 GMT。
爹有儿子必然有啊:
public Date(long date)
使用给定的毫秒时间值构造一个Date对象。 如果给定的毫秒值包含时间信息,则驱动程序将将时间组件设置为对应于零GMT的默认时区(运行应用程序的Java虚拟机的时区)。
参数 :date - 1970年1月1日以来的毫秒,GMT 00:00:00不超过8099的毫秒表示。负数表示1970年1月1日00:00:00 GMT之前的毫秒数。
public static void testCalendar(){
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(new Date()); //日历对象
rightNow.add(Calendar.DAY_OF_MONTH, 1); //这里给天数多加了一天
//rightNow.add(Calendar.MINUTE, 1);
int year = rightNow.get(Calendar.YEAR);
int month = rightNow.get(Calendar.MONTH) + 1; //默认月份从0开始
int day = rightNow.get(Calendar.DAY_OF_MONTH);
System.out.println(year+":"+month+":"+day);
}
测试输出:2018:9:13,懂否?懂,OK!
发现没?很重要的方法,就要写的少~~~~
说下主要应用吧:会议时间的安排问题,很容易出现交叉冲突,这时使用这个Calendar计算就很方便,虽说我没有试过~~~
LocalDate
是不可变的日期时间对象代表一个日期,往往被视为年月日。但是它也有增加的方法,每次增加都会产生一个新对象,和字符串很像。
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class LocalDateTest {
public static void main(String[] args) {
}
/**
* 把日期对象,按照需要的格式进行输出
*/
public static void outUtilDate() {
LocalDate date = LocalDate.now();
DateTimeFormatter df = DateTimeFormatter.ofPattern("MM/dd/yyyy");
String aa = date.format(df);
System.out.println(aa);
}
public static void outUtilDate2() {
LocalDate date = LocalDate.now();
System.out.println(date.toString()); //默认日期输出格式 ISODate()
}
/**
* 日期输入
*/
public static void inputUtilDate() {
String date = "2018-08-23";
LocalDate aa = LocalDate.parse(date); //按照默认的ISODate格式进行字符串转日期对象
System.out.println(aa.toString());
String date2 = "07/23/2017";
DateTimeFormatter df = DateTimeFormatter.ofPattern("MM/dd/yyyy");
LocalDate bb = LocalDate.parse(date2, df);
System.out.println(bb.toString());
}
}
四个输出结果:自己体会
LocalDate的“修改“——产生新对象,引用重新赋新值:
public static void testCalendar() {
LocalDate date = LocalDate.of(2018, 9, 12);
LocalDate date2 = date.plusDays(10);
LocalDate date3 = date2.plusMonths(3);
int year = date3.getYear();
int month = date3.getMonthValue();
int day = date3.getDayOfMonth();
System.out.println("年:" + year + "--月:" + month + "--日:" + day);
}
在java.util.Date
允许JDBC API鉴定为SQL TIMESTAMP
值被包装。它增加了持有的SQL TIMESTAMP
小数秒值的能力,允许小数秒的规格精度纳秒。时间戳还提供了格式化和分析操作,支持时间戳值JDBC转义语法。
哎呀,反正就是说Timestamp就是把uitl.Date和LocalDateTime转换成持久层能接受的值,说白了就是再持久层和前端之间进行保媒拉纤的。
下面用为代码表示一下与util.Date之间的转换:
public static void inputSqlTimstamp() {
try {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date optime = sd.parse("2018-5-1 13:25:18");
Connection conn = null;
String sql = "insert into tuser values(?,?,?,?)";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setTimestamp(1, new java.sql.Timestamp(optime.getTime())); //从java.util.Date转成java.sql.TimeStamp
pst.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
与LocalDateTime的转换:
/**
* java.sql.Timestamp与LocalDateTime之间的转换
*/
public static void inputSqlTimstamp() {
try {
LocalDateTime time = LocalDateTime.of(2016, 10, 5,13, 25);
Connection conn = null;
String sql = "insert into tuser values(?,?,?,?)";
PreparedStatement pst = conn.prepareStatement(sql);
java.sql.Timestamp bb = java.sql.Timestamp.valueOf(time); //时间转换
pst.setTimestamp(1, bb);
pst.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
先哔哔到这了~~~~~!!!!!!
哎,你说说搞的让人烦不烦啊,就不能改到位嘛~~~~,蜜汁日期,看情况还得变。。。。我的那道题还没给出,有时间就补上,,,,,