一、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()