Java中的日期相关操作

小爷心情很糟糕

今天突然笔试到一道关于时间操作的题目,认为会很简单,可是写着写着突然懵逼了~~~,关键是到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

好吧,比比这些似乎也没啥用,上代码干活吧~~~~~~

java.util.Date 和 java.text.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();
		}
	}
}

运行结果:

第一个是正常人想看到的结果;

第二个是把输入的正常格式转换成默认的标准格式。。。。

java.sql.Date 与 java.util.Date 之间的转换:

先看一下它们之间的关系,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之前的毫秒数。 

java.util.Calendar很重要,对时间进行加减操作:

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计算就很方便,虽说我没有试过~~~

来一波 java.time.LocalDate:

  • 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());
		
	}

}

四个输出结果:自己体会

Java中的日期相关操作_第1张图片

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.sql.Timestamp 与 uitl.Date、 LocalDateTime之间的转换:

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();
	}		
    	
}
    

先哔哔到这了~~~~~!!!!!!

哎,你说说搞的让人烦不烦啊,就不能改到位嘛~~~~,蜜汁日期,看情况还得变。。。。我的那道题还没给出,有时间就补上,,,,,

你可能感兴趣的:(javaSE,Java8日期,java日期,Date操作,Calendar,Java日期操作)