菜鸟之路Day06一一Java常用API

简介: 《菜鸟之路Day06——Java常用API》由blue编写,发布于2025年1月24日。本文详细介绍了Java中常用的API,包括JDK7的时间类(Date、SimpleDateFormat、Calendar)和JDK8新增的时间API(ZoneId、Instant、DateTimeFormatter等),以及包装类的使用。通过多个实例练习,如时间计算、字符串转整数、十进制转二进制等,帮助读者巩固所学内容,提升编程技能。文章强调了理论与实践结合的重要性,鼓励读者多做练习以提高学习效率。

菜鸟之路Day06一一Java常用API

作者:blue

时间:2025.1.24

0.概述

学习内容来自,黑马程序员BV17F411T7Ao

今天是菜鸟之路的第六天,经过昨天的学习效率的下降,今天,我在看视频时,遇到练习,先自己做一遍。不再去管其有用或是没用,毕竟疑行无名,疑事无功。毕竟有算法的基础,这些练习还是相对来说比较简单的。加油吧,今天先下班。

1.JDK7时间类

1.1Date

1.1.1如何创建日期对象

//空参构造
//public Date()
Date date = new Date();

//带参构造
//public Date(long date)
Date date = new Date(指定毫秒值);

1.1.2如何修改时间对象中的毫秒值

//public void setTime(long time)

1.1.3如何获取时间对象的毫秒值

//public long getTime()

1.1.4练习

package Time;

import java.util.Date;
import java.util.Random;

public class DateDemo1 {
   
    public static void main(String[] args) {
   

        //需求1:打印时间原点开始一年之后的时间

        //分析:
        //1s=1000ms
        //1min=60*1000ms
        //1h=60*60*1000ms
        //1day=24*60*60*1000ms
        //1year=365*24*60*60*1000ms

        Date d = new Date(0L); //原始时间:Thu Jan 01 08:00:00 CST 1970
        System.out.println(d);

        Date d1 = new Date((365L*24*60*60*1000));//一年后的时间
        System.out.println(d1);


        //需求2:定义任意两个Date对象,比较哪个时间在前,哪个时间在后
        Random r = new Random();
        Date d2 = new Date(Math.abs(r.nextInt()));
        Date d3 = new Date(Math.abs(r.nextInt()));
        System.out.println(d2);
        System.out.println(d3);
        if(d3.getTime()>d2.getTime()){
   
            System.out.println("d3时间在后");
        }else{
   
            System.out.println("d2时间在后");
        }

    }
}

1.2SimpleDateFormat

1.2.1SimpleDateFormat的作用

①格式化 (日期对象 - > 字符串)

②解析 (字符串 - > 日期对象)

1.2.2方法

public SimpleDateFormat()//默认格式 1970/1/1
public SimpleDateFormat(String pattern) //指定格式化格式

public final String format(Date date)    //格式化    (日期对象 - > 字符串)
public Date parse(String source)     //解析    (字符串 - > 日期对象)

1.2.3练习

package Time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo1 {
   
    public static void main(String[] args) throws ParseException {
   
        method1();
        method2();
    }

    //练习1:
    private static void method1() throws ParseException {
   
        //需求:假设初恋出生日期为:2000-11-11
        //用字符串表示这个数据,并转换为:2000年11月11日

        String str = "2000-11-11";
        //细节:创建对象的格式要跟字符串的格式完全一致
        SimpleDateFormat sdf = new SimpleDateFormat("y-M-d");
        Date date = sdf.parse(str);//解析字符串,还原为日期对象

        SimpleDateFormat sdfNew = new SimpleDateFormat("y年M月d日");
        System.out.println(sdfNew.format(date));//将日期格式化为字符串
    }

    //练习2:
    private static void method2() throws ParseException {
   
        //秒杀开始时间:2023年11月11日 0:0:0
        //秒杀结束时间:2023年11月11日 0:10:0
        //需求:小贾2023年11月11日 0:01:0      小皮2023年11月11日 0:11:0
        //用代码说明他们又没有参加上秒杀活动

        String startTime = "2023年11月11日 0:0:0";
        String endTime = "2023年11月11日 0:10:0";

        String xjTime = "2023年11月11日 0:01:0";
        String xpTime = "2023年11月11日 0:11:0";

        //解析时间
        SimpleDateFormat sdf = new SimpleDateFormat("y年M月d日 H:m:s");
        Date start = sdf.parse(startTime);
        Date end = sdf.parse(endTime);
        Date xj = sdf.parse(xjTime);
        Date xp = sdf.parse(xpTime);

        if(xj.getTime()>=start.getTime()&&xj.getTime()<= end.getTime()){
   
            System.out.println("小贾成功参与活动");
        }
        else System.out.println("小贾没有成功参与活动");

        if(xp.getTime()>=start.getTime()&&xp.getTime()<= end.getTime()){
   
            System.out.println("小皮成功参与活动");
        }
        else System.out.println("小皮没有成功参与活动");
    }
}

1.2.4格式化规则

在API帮助文档中,可以清楚的查阅SimpleDateFormat的格式化规则

image-20250124103755561.png

1.3Calendar

个人感觉这个类作用不大,进在此记录一些基础的应用

细节点:日历类中月份的范围:0~11

​ 日历类中星期的特点:星期日是一周中的第一天

public static calendar getInstance() //获取当前时间的日历对象

public final Date getTime()    //获取日期对象

public final setTime(Date date)//给日历设置日期对象

public long getTimeInMillis()//拿到时间亳秒值

public void setTimeInMillis(long millis)//给日历设置时间亳秒值

public int get(int field)//取日期中的某个字段信息

public void set(int field,int value)//修改日历的某个字段信息

public void add(int field,int amount)//为某个字段增加/减少指定的值

2.JDK8新增时间API

JDK8新增的时间对象都是不可变的

如果我们修改了,减少了,增加了时间

那么调用者是不会发生改变的,而是会产生一个新的时间对象

(JDK8这种设计对并发编程大有好处)

对一下API混个眼熟,大概知道是干什么用的,真正要用的时候,查帮助文档

2.1ZoneId(时区类)

static Set<String> getAvailableZoneIds() //获取Java中支持的所有时区

static ZoneId systemDefault() //获取系统默认时区

static ZoneId of(String zoneId) //获取一个指定时区

2.2Instant(时间戳)

static Instant now() //获取当前时间的Instant对象(标准时间)
static Instant ofXxxx(long epochMilli)//根据(秒/毫秒/纳秒)获取Instant对象
ZonedDateTime atZone(ZoneId zone)//指定时区

boolean isXxx(Instant otherInstant)//判断系列方法
    /*
        例子:isAfter:判断调用者代表的时间是否在参数表示时间的后面
        boolean res = instant4.isAfter(instant5);
    */

Instant minusXxx(long millisToSubtract)//减少时间系列的方法
Instant plusXxx(long millisToSubtract)//增加时间系列方法

2.3DateTimeFormatter(日期格式化类)

public static void main(String[] args) {
   
        /*
            static DateTimeFormatter ofPattern(格式)   获取格式对象
            String format(时间对象)                     按照指定方式格式化
        */
        System.out.println(ZoneId.getAvailableZoneIds()); //看看支持的时区
        ZonedDateTime time = Instant.now().atZone(ZoneId.of("Asia/Chongqing"));//获得一个带时区的时间
        DateTimeFormatter df = DateTimeFormatter.ofPattern("y年M月d日 H时m分s秒");
        System.out.println(df.format(time));//格式化

    }

2.4LocalDate,LocalTime,LocalDateTime

至于那些修改的方法,还是查文档吧............混个眼熟

public static void main(String[] args) {
   
        //LocalDate 年,月,日
        //LocalTime 时,分,秒
        //LocalDateTime 年,月,日,时,分,秒

        System.out.println(LocalDate.now());//2025-01-24
        System.out.println(LocalTime.now());//12:36:39.439642
        System.out.println(LocalDateTime.now());//2025-01-24T12:36:39.439642
    }

2.5计算时间间隔的类

Duration:用于计算两个“时间”间隔(秒,纳秒)

Period:用于计算两个“日期”间隔(年,月,日)

ChronoUnit:用于计算两个“日期”间隔

3.包装类

包装类:用一个对象,把基本数据类型给包起来,现在包装类都会自动拆箱和装箱,不需要再去new,直接当基本数据类型使用即可。包装类比起基本数据类型,内置了许多有用的方法,提升了开发效率,并且将基本数据类型进行包装后,方便了其在集合框架内使用。

8种包装类:

  • Integer 对应 int
  • Long 对应 long
  • Double 对应 double
  • Float 对应 float
  • Character 对应 char
  • Boolean 对应 boolean
  • Byte 对应 byte
  • Short 对应 short

8种包装类当中,除了Character都有对应的parseXxx方法,进行类型转换,故而我们的键盘录入格式可以改写为以下这种更优秀的格式。直接接收一整行数据,这样避免了字符串不能接收空格,接收完了再做类型转换.统一了接收格式

public static void main(String[] args) {
   
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();//直接接收整行数据
        int x = Integer.parseInt(line);
        double y = Double.parseDouble(line);
        System.out.println(x);
        System.out.println(y);
    }

4.综合练习

练习一

需求:键盘录入一些1-100之间的整数,并添加到集合中,直到集合中所有的数据和超过200为止

    public static void main(String[] args) {
   
        ArrayList<Integer> list = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        int sum = 0;
        System.out.println("请输入1-100以内的整数");
        while(sum<200){
   
            int x = Integer.parseInt(sc.nextLine());
            if(x<1||x>100){
   
                System.out.println("输入有误,请输入1-100以内的整数");
                continue;
            }
            sum+=x;
            list.add(x);
        }
        for (Integer i : list) {
   
            System.out.print(i+" ");
        }
    }

练习二

自己实现parseInt方法的效果,将字符串形式的数据转成整数。要求:
1.字符串中只能是数字不能有其他字符
2.最少一位,最多10位
3.0不能开头

import java.util.Scanner;

public class Test2 {
   
    public static void main(String[] args) {
   
        int ans;
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        while(true){
   
            if(check(str)){
   
                ans = StringToInt(str);
                break;
            }
            else {
   
                System.out.println("输入有误,请重新输入:");
                str = sc.nextLine();
            }
        }
        System.out.println(ans);
    }

    private static boolean check(String str) {
   //检查是否符合条件
        if(str.charAt(0)=='0') return false;//0不能开头
        if(str.length()>10) return false;//最少一位,最多10位
        for(int i = 0; i< str.length(); i++){
   //字符串中只能是数字不能有其他字符
            char c = str.charAt(i);
            if(c<'0'||c>'9'){
   
                return false;
            }
        }
        return true;
    }

    private static int StringToInt(String str){
   //字符串转整数
        int res = 0;
        for(int i = 0; i< str.length(); i++){
   
            char c = str.charAt(i);
            res=res*10+(c-'0');
        }
        return res;
    }
}

其中check方法我们也可以用正则表达式来改写

private static boolean check2(String str){
   
    return str.matches("[1-9]\\d{0,9}");
}//优雅

练习三

定义一个方法自己实现toBinaryString方法的效果,将一个十进制的整数转成字符串表示的二进制

public class Test3 {
   
    public static void main(String[] args) {
   
        System.out.println(IntToBinaryString(100));
    }
    private static String IntToBinaryString(int num){
   
        StringBuilder sb = new StringBuilder();
        while(num!=0){
   
            sb.append(num%2);
            num/=2;
        }
        return sb.reverse().toString();
    }
}

练习四

计算你活了多少天,用JDK7和JDK8两种方式完成

public class Test4 {
   
    public static void main(String[] args) throws ParseException {
   
        //JDK7
        SimpleDateFormat sdf = new SimpleDateFormat("y-M-d");
        Date now = sdf.parse("2025-1-24");
        Date birth = sdf.parse("2003-8-13");
        long time = (now.getTime()-birth.getTime())/1000L/60/60/24;
        System.out.println("我活了"+time+"天");

        //JDK8
        LocalDate ld1 = LocalDate.of(2003,8,13);
        LocalDate ld2 = LocalDate.now();
        long days = ChronoUnit.DAYS.between(ld1,ld2);
        System.out.println("我活了"+days+"天");
    }
}

练习五

public class Test5 {
   
    public static void main(String[] args) {
   
        //JDK7
        Calendar c = Calendar.getInstance();
        c.set(2000,2,1);//月份的范围:0-11    所以这个表示2000-3-1
        //把日历往前减一天
        c.add(Calendar.DAY_OF_MONTH,-1);
        //看当前时间是28还是29
        int day = c.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);

        //JDK8
        //月份的范围:1~12
        LocalDate ld = LocalDate.of(2000,3,1);
        LocalDate ld2 = ld.minusDays(1);
        int day2 = ld2.getDayOfMonth();
        System.out.println(day2);
    }
}
目录
相关文章
|
10天前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
17天前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
177 100
|
17天前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
192 101
|
17天前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
171 101
|
2月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
325 188
|
2月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
231 92
|
4月前
|
缓存 安全 网络协议
借助Java,让Cloudflare API为你的网站管理加速
在数字化时代,网站与应用的稳定运行至关重要。Cloudflare API作为得力助手,可高效管理网站功能。本文深入探讨基于Java的Cloudflare API自动化操作,涵盖DNS管理、防火墙配置、缓存清理、SSL/TLS设置及Worker脚本部署等核心功能。同时,提供环境准备、认证配置、最佳实践(如请求重试与批量优化)、错误处理及安全增强措施的详细指导。通过这些步骤,构建稳定高效的自动化管理系统,助力网站稳健前行。
148 0
|
3月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
348 80
|
20天前
|
安全 Java API
使用 Java 构建强大的 REST API 的四个基本技巧
本文结合探险领域案例,分享Java构建REST API的四大核心策略:统一资源命名、版本控制与自动化文档、安全防护及标准化异常处理,助力开发者打造易用、可维护、安全可靠的稳健API服务。
112 2
|
3月前
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
235 83

热门文章

最新文章