64_Java_常用类2_时间_Compare_System_Math

举报
alexsully 发表于 2021/06/06 19:35:55 2021/06/06
【摘要】 System类中currentTimeMillis(); java.util.Date和子类java.sql.Date SimpleDateFormat Calendar SimpleDateFormat LocalDate、LocalTime、LocalDateTime Instant DateTimeFormatter Comparator Comparable System_Math

 时间

jdk 8之前的日期时间的API
  1. System类中currentTimeMillis();
  2. java.util.Date和子类java.sql.Date
  3. SimpleDateFormat   
  4. Calendar

 

1.两个构造器的使用
  >构造器1: Date():创建一个对应当前时间的Date对象 #空参构造器
  >构造器2: 创建指定毫秒数的Date对象; #传入一个时间戳

2.两个方法的使用
  >toString():显示当前的年、月、日、时、分、秒
  >getTime():获取当前Date对象对应的毫秒数。(时间戳)

3. java.sql.Date对应着数据库中的日期类型的变量
  >如何实例化
  >如何将java.util.Date对象转换为java.sql.Date对象

 

//构造器一:Date():创建一个对应当前时间的Date对象
  Date date1 = new Date();
  System.out.println(date1); //默认调用 .toString() 方法 //Sat Feb 16 16:35:31 GMT+08:00 2019  ()
  System.out.println(date1.getTime());  //1550306204104  转为时间戳

//构造器二:创建指定毫秒数的Date对象
   Date date2 = new Date(155030620410L);
   System.out.println(date2.toString());

//创建java.sql.Date对象
   java.sql.Date date3 = new java.sql.Date(35235325345L);  # new java.sql.Date(时间戳) -构造器,无空参构造器 
   System.out.println(date3);//1971-02-13  

//如何将java.util.Date对象转换为java.sql.Date对象
    Date date6 = new Date();  # java.util.Date
    java.sql.Date date7 = new java.sql.Date(date6.getTime());  # 传入时间戳
SimpleDateFormat的使用:SimpleDateFormat对日期Date类的格式化和解析
  1.两个操作 格式化 (日期 --->字符串) —— 解析 (格式化的逆过程,字符串 ---> 日期)
  2.SimpleDateFormat的实例化
//实例化SimpleDateFormat:使用默认的构造器  SimpleDateFormat sdf = new SimpleDateFormat();
//格式化:日期 --->字符串
//解  析:格式化的逆过程,字符串 ---> 日期


 

public class DateTest1 {
    public static void main(String[] args) throws ParseException {
        java.util.Date date = new java.util.Date();

        //按照指定的方式格式化和解析:调用带参的构造器
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

//格式化 日期 --> 字符串
        String format1 = sdf1.format(date);
        System.out.println(format1);//2021-06-06 05:24:13

//解析: 字符串 --> 日期
        //要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则,抛异常
        Date date2 = sdf1.parse("2021-12-12 23:11:11");

        System.out.println(date2); //Sun Dec 12 23:11:11 CST 2021

    }
}


 Calendar日历类(抽象类)的使用 

public void testCalendar(){
        //1.实例化
        //方式一:创建其子类(GregorianCalendar)的对象
        //方式二:调用其静态方法getInstance()
        Calendar calendar = Calendar.getInstance();
//        System.out.println(calendar.getClass());

        //2.常用方法
        //get()
        int days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));

        //set()
        //calendar可变性
        calendar.set(Calendar.DAY_OF_MONTH,22);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //add()
        calendar.add(Calendar.DAY_OF_MONTH,-3);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //getTime():日历类---> Date
        Date date = calendar.getTime();
        System.out.println(date);

        //setTime():Date ---> 日历类
        Date date1 = new Date();
        calendar.setTime(date1);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

    }

jdk 8之后的日期时间的API测试

  LocalDate、LocalTime、LocalDateTime 

Instant的使用 类似于 java.util.Date类
DateTimeFormatter:格式化或解析日期、时间

public class LocalDateTimeTest {

    @Test
    public void test1(){
        //now():获取当前的日期、时间、日期+时间
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();

        //of():设置指定的年、月、日、时、分、秒。没有偏移量
        LocalDateTime localDateTime1 = LocalDateTime.of(2021, 10, 6, 13, 23, 43);
        System.out.println(localDateTime1); //2021-10-06T13:23:43

        //getXxx():获取相关的属性
        System.out.println(localDateTime.getDayOfMonth());
        System.out.println(localDateTime.getDayOfWeek());
        System.out.println(localDateTime.getMonth());
        System.out.println(localDateTime.getMonthValue());
        System.out.println(localDateTime.getMinute());

        //体现不可变性
        //withXxx():设置相关的属性
        LocalDate localDate1 = localDate.withDayOfMonth(22);
        System.out.println(localDate);
        System.out.println(localDate1);

        LocalDateTime localDateTime2 = localDateTime.withHour(4);
        System.out.println(localDateTime);
        System.out.println(localDateTime2);


        //不可变性
        LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
        System.out.println(localDateTime);
        System.out.println(localDateTime3);

        LocalDateTime localDateTime4 = localDateTime.minusDays(6);
        System.out.println(localDateTime);
        System.out.println(localDateTime4);

    }
    @Test
    public  void test2(){
        //now():获取本初子午线对应的标准时间
        Instant instant = Instant.now();
        System.out.println(instant);//2021-06-06T10:57:20.553Z

        //添加时间的偏移量
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime);//2021-06-06T18:57:20.553+08:00

        //toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数  ---> Date类的getTime()
        long milli = instant.toEpochMilli();
        System.out.println(milli); //1622977040553

        //ofEpochMilli():通过给定的毫秒数,获取Instant实例  -->Date(long millis)
        Instant instant1 = Instant.ofEpochMilli(1550475314878L);
        System.out.println(instant1); //2019-02-18T07:35:14.878Z
    }


    @Test
    public void test3(){
        // 重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
        DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        //格式化
        String str4 = formatter3.format(LocalDateTime.now());  // 传入TemporalAccessor
        System.out.println(str4);//2021-06-06 07:01:36

        //解析
        TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
        System.out.println(accessor); //{SecondOfMinute=9, NanoOfSecond=0, MicroOfSecond=0, MinuteOfHour=52, MilliOfSecond=0, HourOfAmPm=3},ISO resolved to 2019-02-18

    }
}

 

Comparable接口与Comparator的使用的对比:
   Comparable接口的方式一旦确定,保证Comparable接口实现类的对象在任何位置都可以比较大小。
   Comparator接口属于临时性的比较。

 

Comparable接口的使用举例:  自然排序
 1.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式,例:String 重写compareTo() 从小到大排列。
 2.重写compareTo(obj)的规则:
     如果当前对象this大于形参对象obj,则返回正整数,
     如果当前对象this小于形参对象obj,则返回负整数,
     如果当前对象this等于形参对象obj,则返回零。
 3.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。在compareTo(obj)方法中指明如何排序

 

 public void test2(){
        Goods[] arr = new Goods[5];
        arr[0] = new Goods("lenovoMouse",34);
        arr[1] = new Goods("dellMouse",43);
        arr[2] = new Goods("xiaomiMouse",12);
        arr[3] = new Goods("huaweiMouse",65);
        arr[4] = new Goods("microsoftMouse",43);

        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }


public class Goods implements  Comparable{

    private String name;
    private double price;

    public Goods() {
    }

    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    //指明商品比较大小的方式:按照价格从低到高排序,再按照产品名称从高到低排序
    @Override
    public int compareTo(Object o) {
//        System.out.println("**************");
        if(o instanceof Goods){
            Goods goods = (Goods)o;
            //方式一:
            if(this.price > goods.price){
                return 1;
            }else if(this.price < goods.price){
                return -1;
            }else{
//                return 0;
               return -this.name.compareTo(goods.name);
            }
            //方式二:
//           return Double.compare(this.price,goods.price);
        }
//        return 0;
        throw new RuntimeException("传入的数据类型不一致!");
    }
}

    Comparator接口的使用:定制排序
    1.背景:
    当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,
    那么可以考虑使用 Comparator 的对象来排序
    2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
    如果方法返回正整数,则表示o1大于o2;
    如果返回0,表示相等;
    返回负整数,表示o1小于o2

public class CompareTest {
    @Test
    public  void test1(){
        Goods[] arr = new Goods[5];
        arr[0] = new Goods("lenovoMouse",34);
        arr[1] = new Goods("dellMouse",43);
        arr[2] = new Goods("xiaomiMouse",12);
        arr[3] = new Goods("huaweiMouse",65);
        arr[4] = new Goods("microsoftMouse",43);

        Comparator goodsComparator = new Comparator() {


            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof Goods && o2 instanceof Goods){
                    Goods g1 = (Goods)o1;
                    Goods g2 = (Goods)o2;
                    return -Double.compare(g1.getPrice(), g2.getPrice());
                }else
                    throw  new RuntimeException("输入类型不对");
            }
        };

        Arrays.sort(arr, goodsComparator);

        System.out.println(Arrays.toString(arr));
    }
}

public class SystemTest {
    /*
System类 System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实 例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便 的进行调用。
成员变量
   System类内部包含in、out和err三个成员变量,分别代表标准输入流 (键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。

成员方法
native long currentTimeMillis(): 该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时 间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
void exit(int status): 该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表 异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等
void gc(): 该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则 取决于系统中垃圾回收算法的实现以及系统执行时的情况。
String getProperty(String key): 该方法的作用是获得系统中属性名为key的属性对应的值。系统中常见 的属性名以及属性的作用如下表所示:

     */

    @Test
    public void test1() {
        String javaVersion = System.getProperty("java.version");
        System.out.println("java的version:" + javaVersion);

        String javaHome = System.getProperty("java.home");
        System.out.println("java的home:" + javaHome);

        String osName = System.getProperty("os.name");
        System.out.println("os的name:" + osName);

        String osVersion = System.getProperty("os.version");
        System.out.println("os的version:" + osVersion);

        String userName = System.getProperty("user.name");
        System.out.println("user的name:" + userName);

        String userHome = System.getProperty("user.home");
        System.out.println("user的home:" + userHome);

        String userDir = System.getProperty("user.dir");
        System.out.println("user的dir:" + userDir);

    }

    /*

    BigInteger类
 Integer类作为int的包装类,能存储的最大整型值为231-1,Long类也是有限的, 最大为263-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类 都无能为力,更不用说进行运算了。
 java.math包的BigInteger可以表示不可变的任意精度的整数。BigInteger 提供 所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。 另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、 位操作以及一些其他操作。
 构造器
 BigInteger(String val):根据字符串构建BigInteger对象

 常用方法
public BigInteger abs():返回此 BigInteger 的绝对值的 BigInteger。
BigInteger add(BigInteger val) :返回其值为 (this + val) 的 BigInteger
BigInteger subtract(BigInteger val) :返回其值为 (this - val) 的 BigInteger
BigInteger multiply(BigInteger val) :返回其值为 (this * val) 的 BigInteger
BigInteger divide(BigInteger val) :返回其值为 (this / val) 的 BigInteger。整数 相除只保留整数部分。
BigInteger remainder(BigInteger val) :返回其值为 (this % val) 的 BigInteger。
BigInteger[] divideAndRemainder(BigInteger val):返回包含 (this / val) 后跟 (this % val) 的两个 BigInteger 的数组。
BigInteger pow(int exponent) :返回其值为 (thisexponent) 的 BigInteger

     */

    /*
    BigDecimal类
一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中, 要求数字精度比较高,故用到java.math.BigDecimal类。  BigDecimal类支持不可变的、任意精度的有符号十进制定点数。
 构造器
public BigDecimal(double val)
public BigDecimal(String val)

常用方法
public BigDecimal add(BigDecimal augend)
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
     */

    @Test
    public void test2() {
        BigInteger bi = new BigInteger("1243324112234324324325235245346567657653");
        BigDecimal bd = new BigDecimal("12435.351");
        BigDecimal bd2 = new BigDecimal("11");
        System.out.println(bi);
//         System.out.println(bd.divide(bd2));
        System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
        System.out.println(bd.divide(bd2, 25, BigDecimal.ROUND_HALF_UP));

    }

}





【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。