Java基础18-JDK1.8之前日期时间API

/*

  • 日期时间的API:
  • 1、JDK1.8之前
  • 2、JDK1.8之后
  • 一、JDK1.8之前
    *** 1、java.util.Date**
 * (1)new Date()
 * (2)new Date(毫秒)
 * (3)long getTime()
@Test
	public void test1(){
		Date d = new Date();
		System.out.println(d);
	}

在这里插入图片描述

	@Test
	public void test2(){
		long time = System.currentTimeMillis();
		System.out.println(time);//1559806982971
		//当前系统时间距离1970-1-1 0:0:0 0毫秒的时间差,毫秒为单位
	}

在这里插入图片描述
得到的毫秒
Date也可以得到毫秒

@Test
	public void test3(){
		Date d = new Date();
		long time = d.getTime();
		System.out.println(time);//1559807047979
	}

在这里插入图片描述
将毫秒值变成时间

		@Test
	public void test4(){
		long time = 1559807047979L;
		Date d = new Date(time);
		System.out.println(d);
	}
		

在这里插入图片描述
若是数字特别大

@Test
	public void test5(){
		long time = Long.MAX_VALUE;
		Date d = new Date(time);
		System.out.println(d);
	}

在这里插入图片描述
年份数字很大

** 2、java.util.Calendar:日历类型**

  • 抽象类,它有子类GregorianCalendar,很长不容易记
  • Calendar内部提供了一个getInstance()方法,获取一个对象
@Test
public void test6(){
	Calendar c = Calendar.getInstance();
	System.out.println(c);
	

在这里插入图片描述
在这里插入图片描述

内部new了一个对象,日历里的所有东西都有
从上面结果中取得年份等

	@Test
	public void test6(){
		Calendar c = Calendar.getInstance();
		System.out.println(c);
		
		int year = c.get(Calendar.YEAR);
		System.out.println(year);
		
		int month = c.get(Calendar.MONTH)+1;//从0开始
		System.out.println(month);
		
		//...
	}

在这里插入图片描述
在这里插入图片描述
够可以通过以上属性获取

** 3、java.util.TimeZone**:时区类型

static TimeZone getTimeZone(String ID)  //获取给定ID的TimeZone
@Test
	public void test8(){
	//获取所有Java中支持的ID
		String[] all = TimeZone.getAvailableIDs();
		for (int i = 0; i < all.length; i++) {
			System.out.println(all[i]);
		}
	}
	

在这里插入图片描述

@Test
	public void test7(){
		TimeZone t = TimeZone.getTimeZone("America/Los_Angeles");
		
		//getInstance(TimeZone zone)
		Calendar c = Calendar.getInstance(t);
		System.out.println(c);
	}

在这里插入图片描述

** 4、java.text.DateFormat**:格式化问题

  • java.text.SimpleDateFormat
@Test
	public void test9(){
		Date d = new Date();d
System.out.println(d);
		SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒  E Z");
		//把Date日期转成字符串,按照指定的格式转
		String str = sf.format(d);
		System.out.println(str);
	}

System.out.println(d)输出;
在这里插入图片描述
String str = sf.format(d);
System.out.println(str);输出
在这里插入图片描述

@Test
	public void test10() throws ParseException{
		String str = "2019年06月06日 16时03分14秒 545毫秒  星期四 +0800";
		SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒  E Z");
		Date d = sf.parse(str);
		System.out.println(d);
	}
	

在这里插入图片描述

模板:
在这里插入图片描述

JDK1.8之后日期时间API

二、JDK1.8之后引入了新的日期时间API
旧的问题:
(1)偏移性:Date中的年份是从1900开始的,而月份是从0开始的
(2)对象的可变性问题
大多数程序员认为,一个日期时间的对象,应该对应一个日期时间的点,不应该变化,
如果想要代表另一个日期时间点,应该用另一个对象来表示。
即对象日期时间对象的修改,应该产生新对象,而不是修改原来的对象。
新版的日期时间对象,不可变,一旦修改会返回新对象。

不可变对象:String、包装类对象,修改就会新对象

(3)格式化:旧版只支持Date,对calendar不支持
(4)旧版日期时间API:它们也不是线程安全的,不能处理闰秒

新版的日期时间API对旧版有补充。
在这里插入图片描述

1、基本类型
LocalDate:本地日期

  @Test
	public void test01(){
		LocalDate now = LocalDate.now();
		System.out.println(now);
	}

在这里插入图片描述

LocalTime:本地时间

 @Test
	public void test02(){
		LocalTime now = LocalTime.now();
		System.out.println(now);
	}

在这里插入图片描述

LocalDateTime:本地日期时间

@Test
	public void test03(){
		LocalDateTime now = LocalDateTime.now();
		System.out.println(now);
	}

在这里插入图片描述
上图T表示time,前面日期,后面时间
这三个代替原来的java.util.Date和java.util.Calendar

 (1)now()
 (2)of(xx)
 (3)getXxx():获取什么值
  (4)plusXxx:加上什么
  (5)minusXxx:减去什么
 (6)isLeapYear():是否是闰年

e.g:

@Test
	public void test04(){
		LocalDate lai = LocalDate.of(2019, 5, 13);
		System.out.println(lai);
	}

在这里插入图片描述

@Test
	public void test05(){
		LocalDate lai = LocalDate.of(2019, 5, 13);
		System.out.println(lai.getDayOfYear());
	}

这一年第多少天
在这里插入图片描述

	@Test
	public void test06(){
		LocalDate lai = LocalDate.of(2019, 5, 13);
		LocalDate go = lai.plusDays(160);
		System.out.println(go);//2019-10-20
	}
	

160天以后的日期
在这里插入图片描述

@Test
	public void test7(){
		LocalDate now = LocalDate.now();
		LocalDate before = now.minusDays(100);
		System.out.println(before);//2019-02-26
	}

100天之前的日期
在这里插入图片描述

2、日期时间格式化
对应于老版:SimpleDateFormat

@Test
	public void test8(){
		LocalDateTime now = LocalDateTime.now();
		
		DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒  SSS毫秒  E 是这一年的D天");
		String str = df.format(now);
		System.out.println(str);
	}

Pattern:模式
在这里插入图片描述

@Test
	public void test9(){
		LocalDateTime now = LocalDateTime.now();
		
		DateTimeFormatter df = DateTimeFormatter.ISO_DATE_TIME;//2019-06-06T16:38:23.756
		String str = df.format(now);
		System.out.println(str);
	}

预定义格式,已定义好的一种模板
在这里插入图片描述

	LocalDateTime now = LocalDateTime.now();
		
//		DateTimeFormatter df = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);//2019年6月6日 下午04时40分03秒
		DateTimeFormatter df = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);//19-6-6 下午4:40
		String str = df.format(now);
		System.out.println(str);
	}
DateTimeFormatter df = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);   输出结果

在这里插入图片描述
DateTimeFormatter df = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT) 输出结果
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐