Java高级----Format类、时间新特性总结----含思维导图


一、Format类

1、简介:格式化数字和日期的类,里面有format();方法。
2、数字处理

  (一) Number类:
     定义:Number类是java.lang包下的一个抽象类,提供了将包装类型拆箱成基本类型的方法,所有基本类型(数据类型)的封装类型都继承了该抽象类,并且是final声明不可继承改变。
  (二) NumberFormat抽象类:
  (1) NumberFormat类是所有数值格式的基类。此类提供格式化和解析数值的接口。
  (2) NumberFormat类是一个抽象类,是Format的子类,因此不能使用new的方式创建对象,在使用时可以直接使用NumberFormat类中提供的静态方法为其实例化。
  (3) NumberFormat类常用方法:
    ① format() 格式化,按照指定格式进行格式化
    ② getInstance() 返回NumberFormat的一个实例:

         static double i2 = 12233454.12;
         NumberFormat number1 = NumberFormat.getInstance(Locale.CHINA);
         System.out.println(number1.format(i2));
         //输出:12,233,454.12

     	static double i2 = 12233454.12;
		NumberFormat number1 = NumberFormat.getInstance(Locale.JAPAN);
		System.out.println(number1.format(i2));
		//输出:12,233,454.12

		static double i2 = 12233454.12;
		NumberFormat number1 = NumberFormat.getInstance(Locale.US);
		System.out.println(number1.format(i2));
		//输出:12,233,454.12

    ③ getIntegerInstance() 返回整数格式实例,有小数的会四舍五入
    ④ getCurrencyInstance() 返回货币格式实例(默认格式):

        static double i2 = 12233454.12;
		NumberFormat number1 = NumberFormat.getCurrencyInstance(Locale.US);
		System.out.println(number1.format(i2));
		// 输出:$12,233,454.12
		
		static double i2 = 12233454.12;
		NumberFormat number1 = NumberFormat.getCurrencyInstance(Locale.CHINA);
		System.out.println(number1.format(i2));
		// 输出:¥12,233,454.12

    ⑤ getPercentInstance() 返回的百分比格式实例:

		static double i3 = 0.15;
		NumberFormat number1 = NumberFormat.getPercentInstance();
		System.out.println(number1.format(i3));
		//输出15%

    ⑥ parse() 根据指定格式将字符串转换成一个数字:

		NumberFormat mFormat = NumberFormat.getInstance();
		Number num;
		try {
		num = mFormat.parse("1,234,567.8");
		double d = num.doubleValue();
		System.out.println(d);
		} catch (Exception e) {
			// TODO: handle exception
		}
		*****************************************
		try {		
			//将,用空格替换
			String str = "1,234,567.8".replace(",", "");
			double d1 = Double.parseDouble(str);
   		 } catch (Exception e) {
			// TODO: handle exception
 		}

  (三) DecimalFormat类(实现类):
  (1) 介绍:
    ① DecimalFormat类是NumberFormat类的一个具体子类,用于格式化十进制数字。
    ② DecimalFormat类可以直接使用new关键字创建对象。
    ③ 3、DecimalFormat类可以根据指定的模式对数字进行格式化。
  (2) 常用模式:
    ① # :如果是0不用表示

	DecimalFormat de = new DecimalFormat("###,###.###");
	System.out.println(de.format(12340.56));
	System.out.println(de.format(123456789.12355));
	//输出为:12,340.56
	//输出为:123,456,789.124 会四舍五入

    ② 0 :如果是0,需要表示出来:

	DecimalFormat de = new DecimalFormat("000,000.000");
	System.out.println(de.format(1230.06));
	System.out.println(de.format(1234567890.10234));
	// 输出为:001,230.060
	// 输出为:1,234,567,890.102

    ③ . :小数分隔符
    ④ , :分隔符分组分隔符
    ⑤ % : 乘以100并显示为百分数

	DecimalFormat de = new DecimalFormat("###.##%");
	System.out.println(de.format(0.51235));
	//输出:51.23%
	**************************************
	DecimalFormat de1 = new DecimalFormat("000.00%");
	System.out.println(de1.format(0.51235));
	//输出:051.23%

    ⑥ \u00A4 ;货币格式:

	DecimalFormat de = new DecimalFormat("$#,###.###");
	System.out.println(de.format(1234.56));
	//输出为:$1,234.56

    ⑦ parse() 根据指定格式将字符串转换成一个数字:

	DecimalFormat mFormat = new DecimalFormat("\u00A4###,###.###");
	Number num;
	try {
	num = mFormat.parse("$1,234,567.8");
	double d = num.doubleValue();
	System.out.println(d);
	} catch (Exception e) {
		// TODO: handle exception
	}
3、日期处理

  (一) Date类:
  (1) Date类只是一个对long值的对象封装。
  (2) Date类放在java.util包中,因此使用时需要用import关键字引入。
  (3) Java获取系统时间:Date now = new Date();System.out.println(now.getTime());
  (4) getTime()方法返回自1970年1月1日 00:00:00 GMT以来此Date对象表示的毫秒数。
  (5) 从JDK1.1开始,应该使用Calendar类实现日期和时间字段之间转换,使用DateFormat类来格式化和分析日期字符串。Date中的相应方法已废弃。
  (二) DateFormat抽象类:
  (1) DateFormat类用来格式化或解析日期或时间。DateFormat类提供了很多静态方法,可以将日期或时间格式化成不同的风格。
  (2) DateFormat类是一个抽象类,是Format的子类,因此不能使用new的方式创建对象,在使用时可以直接使用NumberFormat类中提供的静态方法为其实例化。
  (3) DateFormat可以解析任何语言环境的日期,其代码可完全与语言环境的约定无关。
  (4) DateFormat类的常用方法:
    ① format() 格式化,按照指定格式进行格式化
    ② getInstance()返回DateFormat的一个实例:

        Date date = new Date();
		DateFormat d1 = DateFormat.getInstance();
		System.out.println(d1.format(date));
		//输出:20-8-21 下午7:54

    ③ getDateInstance() 返回日期格式实例:

        Date date = new Date();
		DateFormat d1 = DateFormat.getDateInstance();
		System.out.println(d1.format(date));
		//输出:2020-8-21
		***********************************************
		Date date = new Date();
		DateFormat d1 = DateFormat.getDateInstance(DateFormat.SHORT);
		System.out.println(d1.format(date));
		//输出:20-8-21
		***********************************************
		Date date = new Date();
		DateFormat d1 = DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA);
		System.out.println(d1.format(date));
		//输出:2020年8月21日

    ④ getTimeInstance() 返回时间格式实例:

		Date date = new Date();
		DateFormat d1 = DateFormat.getTimeInstance();
		System.out.println(d1.format(date));
		//输出:16:36:20
		***********************************************
		Date date = new Date();
		DateFormat d1 = DateFormat.getDateInstance(DateFormat.FULL,Locale.CHINA);
		System.out.println(d1.format(date));
		//输出:下午04时36分50秒CST
		***********************************************
		Date date = new Date();
		DateFormat d1 = DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA);
		System.out.println(d1.format(date));
		//输出:下午4:37

    ⑤ getDateTimeInstance() 返回的日期时间格式实例:

		Date date = new Date();
		DateFormat d1 = DateFormat.getDateTimeInstance();
		System.out.println(d1.format(date));
		//输出:2020-8-21 16:27:45

    ⑥ parse() 根据指定格式将字符串转换成一个日期:

		DateFormat dfFormat = DateFormat.getDateTimeInstance();
		Date dt;
		dt = dfFormat.parse("2011-07-05 17:20:30");
		System.out.println(dt);

  (三) SimpleDateFormat类(实现类):
  (1) 介绍:
    ① SimpleDateFormat类是DateFormat类的一个具体子类,用于格式化日期或时间。
    ② SimpleDateFormat类可以直接使用new关键字创建对象。
    ③ SimpleDateFormat类可以根据指定的模式对日期或时间进行格式化。
  (2) 案例:

	Date date = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd);
	System.out.println(sdf.format(date));
	//输出:2020/08/21  
	**********************************************************
	Date date = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS");
	System.out.println(sdf.format(date));
	//输出:2020/08/21 20:12:21 049

  (3) 常用模式:
    ① yyyy 年。
    ② MM 月 必须大写、否则就是分。
    ③ dd 日。
    ④ HH 时 如果是小写、为12小时制。
    ⑤ mm 分 一定要小写。
    ⑥ SimpleDateFormat类可以根据指定的模式对日期或时间进行格式化。
    ⑥ ss 秒。
    ⑦ SSS 毫秒 一定要大写、否则就是秒。
  (4) 案例:

	SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
	try {
		date = sdf.parse("2020/10/16");
		System.out.println(date);
	} catch (Exception e) {
		// 輸出:Fri Oct 16 00:00:00 CST 2020
	}
	******************************************
	Date date = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat();
	try {
	sdf.applyPattern("yyyy'年'MM'月'dd'日'");
	System.out.println(sdf.format(date));
	} catch (Exception e) {
	// 輸出:2020年08月21日
}

  (四) Calendar类:
  (1) 简介:
    ① Calendar类是一个抽象类,因此不能使用new的方式创建对象,在使用时可以直接使用。
    ② Calendar类中提供的静态方法getInstance()取得Calendar类的一个实例。
    ③ Calendar类为一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
  (2) 案例:

	Calendar c = Calendar.getInstance();
	//获取此时的年份
	System.out.println("年:"+c.get(Calendar.YEAR));
	//获取此时的月份,从0开始
	System.out.println("月:"+(c.get(Calendar.MONTH)+1));
	//获取次月此时的具体是几号
	System.out.println("日:"+c.get(Calendar.DATE));
	//获取此时的时间
	System.out.println("时(12小时体):"+c.get(Calendar.HOUR));
	System.out.println("时(24小时体):"+c.get(Calendar.HOUR_OF_DAY));
	System.ut.println("分:"+c.get(Calendar.MINUTE));
	System.out.println("秒:"+c.get(Calendar.SECOND));
	//按格式输出日期
	Date date = c.getTime();
	System.out.println(new SimpleDateFormat("yyyy/MM/dd 		HH:mm:ss").format(date));
		String week = null;
		switch (c.get(Calendar.DAY_OF_WEEK)) {
		case Calendar.SUNDAY:
			week = "星期日";
			break;
		case Calendar.MONDAY:
			week = "星期一";
			break;
		case Calendar.TUESDAY:
			week = "星期二";
			break;
		case Calendar.WEDNESDAY:
			week = "星期三";
			break;
		case Calendar.THURSDAY:
			week = "星期四";
			break;
		case Calendar.FRIDAY:
			week = "星期五";
			break;
		case Calendar.SATURDAY:
			week = "星期六";
			break;
		}
		System.out.println(week);
	// 加5年
	c.add(Calendar.YEAR, 5);
	System.out.println("新的年:" + c.get(Calendar.YEAR));
	// 减9个月
	c.add(Calendar.MONTH, -9);
	System.out.println("新的月:" + (c.get(Calendar.MONTH) + 1));		         				// 加25天
	c.add(Calendar.DATE, 25);
	System.out.println("新的日:" + c.get(Calendar.DATE));
	date = c.getTime();
	System.out.println("新的時間:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(date));

二、时间新特性

1、DATE和CALENDAR的缺点

  (1) Date如果不格式化,打印出的日期可读性差:Tue Sep 10 09:34:04 CST 2019
  (2) 时间对象实例是不可变的对象,所以我们如果对时间对象进行更改,包括修改时间,加减时间都需要重新返回一个新的实例
  (3) 使用SimpleDateFormat对时间进行格式化,但SimpleDateFormat是线程不安全的。
  (4) Date对时间处理比较麻烦,比如想获取某年、某月、某星期,以及n天以后的时间,如果用Date来处理的话真是太难了,你可能会说Date类不是有getYear、getMonth这些方法吗,获取年月日很Easy,但都被弃用了啊。

2、LOCALDATE类

  (1)介绍:LOCALDATE是不可变的和线程安全的时间类,且支持时区设置,它是JAVA 8提供的全新日期时间类。
  (2) 常用方法:
    ① now()方法:获取当前时间,它是静态方法。

获取当前时间:LocalTime localTime = LocalTime.now();  // 19:59:39.727
获取当前日期:LocalDate localDate = LocalDate.now();//  2020-08-12
获取当前日期与时间:LocalDateTime localDateTime = LocalDateTime.now();    // 2020-08-12T19:59:39.728

    ② of()方法,自定义日期,也可以自定义日期与时间。

			LocalDate of = LocalDate.of(2012, 12,7);     //2012-12-07

    ③ 日期加减:

			对日期时间进行加操作,使用 localDateTime.plusXXX(num)
			对日期时间进行减操作,使用 localDateTime.minusXXX(num)
			修改不限于,年、月、日、时、分、秒、纳秒
			localDateTime.plusYears(2);//加两年
			localDateTime.minusYears(2);//减两年

    ④ 获得时间的某个字段:

			System.out.println( 	localDateTime.getDayOfWeek());//WEDNESDAY
			localDateTime.getYear();
			getXXX()  不加s  可以获得年中第几天  ,月中第几天  星期几

    ⑤ 获取相隔日期:

		LocalDate now2 = LocalDate.now();
		LocalDate now3 = LocalDate.of(2019,8,13);
		System.out.println(now2.toEpochDay()-now3.toEpochDay());

    ⑥ 获取时间差:
     Duration:获取两个时间之间的间隔(LocalDateTime、Instant),只能传入这两种参数

		LocalDateTime now = LocalDateTime.now();
		LocalDateTime now1 = LocalDateTime.of(2020, 8, 13, 7, 4, 3);
		Duration between = Duration.between(now, now1);
		System.out.println(between.toDays());
		System.out.println(between.toHours());

     Period:获取两个时间之间的间隔 (LocalDate),只能传入这一种参数。

		LocalDate now2 = LocalDate.now();
		LocalDate now3 = LocalDate.of(2011,9,10);
		Period between1 = Period.between(now2, now3);
		System.out.println(between1.getYears());//-8
		System.out.println(between1.getDays());// -3
		System.out.println(between1.getMonths()); //-11
年月间隔:
		ChronoUnit.DAYS.between(now2, now3);
		ChronoUnit.MONTHS.between(now2, now3);

    注意
     ① 月份加减,不看年份,日期加减也不看年份
     ② 日期小的放在前面会得到正值
     ③ 参数位置不同,只改变正负

3、Instant类

  (1)介绍:时间戳(以Unix 元年 : 1970-01-01 00:00:00 到某个时间之间的毫秒数)。

Instant now = Instant.now();
System.out.println(now);   //2020-08-12T12:28:58.889Z

System.out.println(now.atOffset(ZoneOffset.ofHours(8)));   //2020-08-12T20:28:58.889+08:00

  (2) 获得毫秒值的方法:

    ① new Date().getTime()
    ② System.currentTimeMillis
    ③ Instant.now().toEpochMilli()

三、思维导图

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值