day17_日期类丶数字类

JDK8之前日期时间API

                                         day17_日期类丶数字类

 

 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秒。
简单来说:使用无参构造,可以自动获取当前系统时间的毫秒时刻;指定long类型的构造参数,可以自定义毫秒时刻。例如
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。
参数pattern是一个字符串,代表日期时间的自定义格式。格式规则 如下图所示                                                     day17_日期类丶数字类

创建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对象。
Calendar类中提供很多成员常量,代表给定的日历字段: 

day17_日期类丶数字类

get方法用来获取指定字段的值,set方法用来设置指定字段的值,代码使用演示:
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类

DecimalFormatNumberFormat十进制数字格式的具体子类 。它具有多种功能,旨在解析和格式化任何语言环境中的数字,包括支持西方,阿拉伯语和印度语数字。它还支持不同类型的数字,包括整数(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;
    }

}
上一篇:表格的横向滚动条房子页面底部


下一篇:机器学习day17使用自组织映射网络