JDK8之前日期时间API
java.util.Date类
java.util.Date 类 表示特定的瞬间,精确到毫秒。继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象。- public Date() :分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
- public Date(long date) :分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。 由于我们处于东八区,所以我们的基准时间为1970年1月1日8时0分0秒。
package DateTest; import java.util.Date; public class Demo01Date { public static void main(String[] args) { // 创建日期对象, 获取系统当前时间(精确到毫秒的系统当前时间) System.out.println(new Date()); //Sat Dec 05 09:47:36 CST 2020 // 创建日期对象,把当前的毫秒值转成日期对象 System.out.println(new Date(0L)); //Thu Jan 01 08:00:00 CST 1970 } }在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。
常用的方法有:
Date类中的多数方法已经过时,我们需要记住的一个方法
- public long getTime() 把日期对象转换成对应的时间毫秒值。
package DateTest; import java.util.Date; public class Demo01Date { public static void main(String[] args) { // 创建日期对象, 获取系统当前时间(精确到毫秒的系统当前时间) Date date = new Date(); System.out.println(date); //Sat Dec 05 09:47:36 CST 2020 //把日期对象转换成对应的时间毫秒值。也就是离时间原点多少毫秒 long time = date.getTime();//1607133044983 System.out.println(time); } }
DateFormat类
java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
- 格式化:按照指定的格式,从Date对象转换为String对象。
- 解析:按照指定的格式,从String对象转换为Date对象。
构造方法
由于DateFormat为抽象类,不能直接使用,所以需要常用的子类 java.text.SimpleDateFormat 。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:- public SimpleDateFormat(String pattern) :用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
创建SimpleDateFormat对象的代码如:
package DateTest; import java.text.DateFormat; import java.text.SimpleDateFormat; public class Demo02SimpleDateFormat { public static void main(String[] args) { // 对应的日期格式如:2018‐01‐16 15:06:38 DateFormat format = new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss"); System.out.println(format);//java.text.SimpleDateFormat@e4702c80 } }
DateFormat类的常用方法有:
- public String format(Date date) :将Date对象格式化为字符串。
- public Date parse(String source) :将字符串解析为Date对象。
package DateTest; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Demo02SimpleDateFormat { public static void main(String[] args) throws ParseException { Date d1 = new Date(); // 创建日期格式化对象,在获取格式化对象时可以指定风格 // 注意:在日期格式中,除了y M d H m s S这些字符不能随便写之外,剩下的符号格式自己随意组织。 DateFormat df = new SimpleDateFormat("yyyy年MM月dd日"); // Date ---> String String s1 = df.format(d1); System.out.println(s1); // 2020年12月05日 // 注意:字符串的日期格式和SimpleDateFormat对象指定的日期格式要一致。不然会出现异常:java.text.ParseException String s2 = "2018年12月11日"; // String --> Date Date d2 = df.parse(s2); System.out.println(d2); // Tue Dec 11 00:00:00 CST 2018 } }
java.lang.System类
- System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法适于计算时间差。
/* 获取自1970年1月1日 00:00:00 000到当前系统时间的总毫秒数。 1秒 = 1000毫秒 简单总结一下System类的相关属性和方法: System.out 【out是System类的静态变量。】 System.out.println() 【println()方法不是System类的,是PrintStream类的方法。】 System.gc() 建议启动垃圾回收器 System.currentTimeMillis() 获取自1970年1月1日到系统当前时间的总毫秒数。 System.exit(0) 退出JVM。 */ public class DateTest02 { public static void main(String[] args) { // 获取自1970年1月1日 00:00:00 000到当前系统时间的总毫秒数。 long nowTimeMillis = System.currentTimeMillis(); System.out.println(nowTimeMillis); //1583377912981 // 统计一个方法耗时 // 在调用目标方法之前记录一个毫秒数 long begin = System.currentTimeMillis(); print(); // 在执行完目标方法之后记录一个毫秒数 long end = System.currentTimeMillis(); System.out.println("耗费时长"+(end - begin)+"毫秒"); } // 需求:统计一个方法执行所耗费的时长 public static void print(){ for(int i = 0; i < 1000000000; i++){ System.out.println("i = " + i); } } }
Calendar类
java.util.Calendar 是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。获取方式
Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下:Calendar静态方法- public static Calendar getInstance() :使用默认时区和语言环境获得一个日历
Calendar cal = Calendar.getInstance();
常用方法
根据Calendar类的API文档,常用方法有:
- public int get(int field) :返回给定日历字段的值。
- public void set(int field, int value) :将给定的日历字段设置为给定值。
- public abstract void add(int field, int amount) :根据日历的规则,为给定的日历字段添加或减去指定的时间量。
- public Date getTime() :返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
package DateTest; import java.util.Calendar; public class CalendarUtil { public static void main(String[] args) { // 创建Calendar对象 Calendar cal = Calendar.getInstance(); // 设置年 int year = cal.get(Calendar.YEAR); // 设置月 int month = cal.get(Calendar.MONTH) + 1; // 设置日 int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); System.out.print(year + "年" + month + "月" + dayOfMonth + "日");//2020年12月5日 } }add方法可以对指定日历字段的值进行加减操作,如果第二个参数为正数则加上偏移量,如果为负数则减去偏移量。代码如:
package DateTest; import java.util.Calendar; public class CalendarUtil { public static void main(String[] args) { // 创建Calendar对象 Calendar cal = Calendar.getInstance(); // 使用add方法 cal.add(Calendar.DAY_OF_MONTH, 2);// 加2天 cal.add(Calendar.YEAR, -3);// 减3年 // 设置年 int year = cal.get(Calendar.YEAR); // 设置月 int month = cal.get(Calendar.MONTH) + 1; // 设置日 int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); System.out.print(year + "年" + month + "月" + dayOfMonth + "日"); // 2017年12月7日 } }Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象。
package DateTest; import java.util.Calendar; import java.util.Date; public class CalendarUtil { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); Date date = cal.getTime(); System.out.println(date); // Sat Dec 05 10:59:38 CST 2020 } }
DecimalFormat类
DecimalFormat
是NumberFormat
十进制数字格式的具体子类 。它具有多种功能,旨在解析和格式化任何语言环境中的数字,包括支持西方,阿拉伯语和印度语数字。它还支持不同类型的数字,包括整数(123),定点数(123.4),科学记数法(1.23E4),百分比(12%)和货币金额(123美元)。而且对于数值的小数部分,默认显示3位小数,在去掉超出小数点后面3位的部分时,会将数值四舍五入为最接近的数值格式化输出。
import java.text.DecimalFormat; /* 关于数字的格式化。 */ public class DecimalFormatTest01 { public static void main(String[] args) { // java.text.DecimalFormat专门负责数字格式化的。 //DecimalFormat df = new DecimalFormat("数字格式"); /* 数字格式有哪些? # 代表任意数字 , 代表千分位 . 代表小数点 0 代表不够时补0 ###,###.## 表示:加入千分位,保留2个小数。 */ DecimalFormat df = new DecimalFormat("###,###.##"); //String s = df.format(1234.56); String s = df.format(1234.561232); System.out.println(s); // "1,234.56" DecimalFormat df2 = new DecimalFormat("###,###.0000"); //保留4个小数位,不够补上0 String s2 = df2.format(1234.56); System.out.println(s2); // "1,234.5600" } }
BigDecimal类
- Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算.
- 其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类.
- BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念.
- float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值.
- BigDecimal类创建的是对象,不能使用传统的+、-、*、/等算术运算符直接对其进行数学运算,而必须调用其对应的方法.方法的参数也必须是BigDecimal类型的对象.
import java.math.BigDecimal; /* 1、BigDecimal 属于大数据,精度极高。不属于基本数据类型,属于java对象(引用数据类型) 这是SUN提供的一个类。专门用在财务软件当中。 2、注意:财务软件中double是不够的。咱们之前有一个学生去用友面试,经理就问了这样一个问题: 你处理过财务数据吗?用的哪一种类型? 千万别说double,说java.math.BigDecimal */ public class BigDecimalTest01 { public static void main(String[] args) { // 这个100不是普通的100,是精度极高的100 BigDecimal v1 = new BigDecimal(100); // 精度极高的200 BigDecimal v2 = new BigDecimal(200); // 求和 // v1 + v2; // 这样不行,v1和v2都是引用,不能直接使用+求和。 BigDecimal v3 = v1.add(v2); // 调用方法求和。 System.out.println(v3); //300 BigDecimal v4 = v2.divide(v1); System.out.println(v4); // 2 } }
Random类
- 此类的实例用于生成伪随机数。
- public int nextInt(int n) :返回一个伪随机数,范围在 0 (包括)和 指定值 n (不包括)之间的int 值。
package com.bjpowernode.javase.random; import java.util.Arrays; import java.util.Random; /* 编写程序,生成5个不重复的随机数[0-100]。重复的话重新生成。 最终生成的5个随机数放到数组中,要求数组中这5个随机数不重复。 */ public class RandomTest02 { public static void main(String[] args) { // 创建Random对象 Random random = new Random(); // 准备一个长度为5的一维数组。 int[] arr = new int[5]; // 默认值都是0 for(int i = 0; i < arr.length; i++){ arr[i] = -1; } // 循环,生成随机数 int index = 0; while(index < arr.length){ // 生成随机数 //int num = random.nextInt(101); //int num = random.nextInt(6); // 只能生成[0-5]的随机数! int num = random.nextInt(4); // 只能生成[0-3]的随机数!永远都有重复的,永远都凑不够5个。 System.out.println("生成的随机数:" + num); // 判断arr数组中有没有这个num // 如果没有这个num,就放进去。 if(!contains(arr, num)){ arr[index++] = num; } } // 遍历以上的数组 for(int i = 0; i < arr.length; i++){ System.out.println(arr[i]); } } /** * 单独编写一个方法,这个方法专门用来判断数组中是否包含某个元素 * @param arr 数组 * @param key 元素 * @return true表示包含,false表示不包含。 */ public static boolean contains(int[] arr, int key){ for(int i = 0; i < arr.length; i++){ if(arr[i] == key){ // 条件成立了表示包含,返回true return true; } } // 这个就表示不包含! return false; } }