首页 > 编程语言 >JavaSE(12) - 常用API(下)

JavaSE(12) - 常用API(下)

时间:2024-01-16 10:26:35浏览次数:25  
标签:11 12 String System Date API println JavaSE out

JavaSE(12) - 常用API(下)

JDK7以前的时间相关类

Date类

  1. 如何创建日期对象
  • Date date = new Date(); //空参构造创建的对象,默认表示系统当前时间
  • Date date = new Date(指定毫秒值);//有参构造创建的对象,表示指定时间
  1. 如何修改时间对象中的毫秒值
  • setTime(毫秒值);
  1. 如何获取时间对象中的毫秒值
  • getTime();

练习:

需求1: 打印时间原点开始一年之后的时间
需求2: 定义任意两个Date对象, 比较一下哪个时间在前,哪个时间在后.

public static void main(String[] args) {
/*需求1: 打印时间原点开始一年之后的时间
需求2: 定义任意两个Date对象, 比较一下哪个时间在前,哪个时间在后.*/
        Date d = new Date(1000L*60*60*24*365);
        System.out.println(d);
        System.out.println("------------");
        //
        Random r = new Random();
        Date d1 = new Date(Math.abs(r.nextInt()));
        Date d2 = new Date(Math.abs(r.nextInt()));
        long time1 = d1.getTime();
        long time2 = d2.getTime();
        System.out.println(d1);
        System.out.println(d2);
        String s = time1 > time2 ? "d1在后面" : "d2在后面";
        System.out.println(s);
    }

P 170 SimpleDateFormat类

作用

格式化 : 把时间变成我们喜欢的格式

解析 : 把字符串表示的时间变成Date对象

**构造方法: ** 说明

public SimpleDateFormat() 构造一个对象, 使用默认格式

public SimpleDateFormat(String pattern) 构造一个对象, 使用指定格式

常用方法 说明

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

public Date parse ( String source ) 解析 (字符串 -> 日期对象)

格式化

//默认格式
        SimpleDateFormat sdf1 = new SimpleDateFormat();
        //指定格式
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 EE ");
        //创建日期对象
        Date date = new Date(0L);
        //把日期对象变成字符串并打印
        String f1 = sdf1.format(date);
        String f2 = sdf2.format(date);
        System.out.println(f1);
        System.out.println(f2);

解析

public static void main(String[] args) throws ParseException {
      
        //解析
        //创建日期字符串
        String date1 = "2023年11月11日 11时11分11秒";
        //创建sdf对象 参数为字符串的格式
    	//创建对象的格式要和字符串的格式一样
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        //使用 parse方法 把字符串解析成Date对象
        Date date2 = sdf.parse(date1);
        System.out.println(date2);
    }

练习1:

2000-11-11 用字符串表示这个数据, 并转换为 : 2000年11月11日

 /*2000-11-11 用字符串表示这个数据,
          并转换为 : 2000年11月11日      */
        String s = "2000-11-11";
        //创建sdf对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //解析成Date对象
        Date date = sdf.parse(s);
        //格式化Date对象成字符串
		//按照需求的格式
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日");
        String s1 = sdf1.format(date);
        System.out.println(s1);

练习2 :

秒杀活动 : 2023年11月11日 0:0:0 ~ 2023年11月11日 0:10:0

小明下单的时间: 2023年11月11日 0:1:0

小红下单的时间: 2023年11月11日 0:11:0

用代码说明两个人有没有参加上秒杀活动.

//字符串
        String order = "2023年11月11日 00:01:00";//小明下单的时间
        String start = "2023年11月11日 0:0:0";//秒杀开始时间
        String end = "2023年11月11日 0:10:0";//秒杀结束时间

        //解析成Date对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date DateOrder = sdf.parse(order);
        Date DateStart = sdf.parse(start);
        Date DateEnd = sdf.parse(end);
        //获取时间数
        long orderTime = DateOrder.getTime();
        long startTime = DateStart.getTime();
        long endTime = DateEnd.getTime();
        //判断是否在秒杀时间段
        if (orderTime > startTime && orderTime < endTime) {
            System.out.println("秒杀成功");
        } else System.out.println("秒杀失败");

P171 Calendar 日历类

Calendar 的常用方法

public static Calendar getlnstance() 获取当前时间的日历对象

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) 为某个字段增加/减少指定的值

**细节1. **

Calendar类是一个抽象类, 不能直接new, 而是通过一个静态方法获取子类对象

细节2.

月份范围 : 0~11 如果获取0,实际是1月

星期 : 星期日是一周的第一天.

1(星期日) 2(星期一) 3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)

  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 date = cal.get(Calendar.DATE);
        //周日是第一天
        int week = cal.get(Calendar.DAY_OF_WEEK);
        //调用方法转换为星期
        String s = castWeek(week);
        System.out.println(year + "," + month + "," + date + "," + s);
    }
    //输入对应的数字符合星期几  ***查表法***   创建数组,使数组元素和索引形成对应关系.====
    //1(星期日)	2(星期一)	3(星期二)	4(星期三)	5(星期四)	6(星期五)	7(星期六)
    public static String castWeek(int number){
        String[] week = {"", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        //传递的形参就是索引, 再返回数组元素
        return week[number];
    }

总结

  1. Calendar表示什么?

​ 表示一个时间的日历对象

2.如何获取对象

​ 通过静态方法 getInstance()方法获取对象

  1. 常见方法:

​ setXxx : 修改

​ getXxx : 获取

​ add : 在原有的基础上进行增加或者减少

  1. 细节点:

​ 日历类中月份的范围:0〜11

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

P 172 JDK8的时间类

1, Date类

ZoneId: 时区类

  //获得所有时区
        Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
//        System.out.println(availableZoneIds);
        System.out.println(availableZoneIds.size());//打印集合长度 600
        //获得系统当前时区 ->对象
        ZoneId zoneId = ZoneId.systemDefault();
        System.out.println(zoneId);
        //获取指定一个时区 字符串->对象
        ZoneId of = ZoneId.of("Asia/Shanghai");
        System.out.println(of);

Instant : 时间戳类

static Instant now() 获取当前时间的Instant对象(标准时间)

static Instant ofXxxx(long epochMilli) 根据(秒/毫秒/纳秒)获取工Instant对象

ZonedDateTime atZone(ZoneId zone) 指定时区

boolean isXxx(工nstant otherlnstant) 判断系列的方法

Instant minusXxx(long millisToSubtract) 减少时间系列的方法

Instant plusXxx(long millisToSubtract) 增加时间系列的方法

 //获取当前日期,时间对象
        Instant now = Instant.now();
        System.out.println(now);
        //获得指定日期时间对象
        Instant instant1 = Instant.ofEpochMilli(1000L);//时间原点后1秒
        System.out.println(instant1);
        //指定时区  不是静态方法,只能用对象去调用
        //就是显示该时区的日期时间
        ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.systemDefault());
        System.out.println(zonedDateTime);//2023-12-14T13:56:07.291154700+08:00[Asia/Shanghai]
        //判断系列的方法
        boolean after = instant1.isAfter(now);//是否在参数时间后
        boolean before = instant1.isBefore(now);//是否在参数时间前
        System.out.println(after);//false
        System.out.println(before);//true
        //减少/增加时间系列的方法
        Instant instant2 = Instant.ofEpochMilli(10000000L);
        Instant instant3 = instant2.minusSeconds(10000000L);//减掉时间
        System.out.println(instant3);

ZoneDateTime : 带时区的时间类

static ZonedDateTime now() 获取当前时间ZonedDateTime对象

static ZonedDateTime ofXxxx(...) 获取指定时间ZonedDateTime对象

ZonedDateTime withXxxx(时间) 修改时间的方法

ZonedDateTime minusXxx(时间) 减少时间的方法

ZonedDateTime plusXxx(时间) 增加时间的方法

细节

JDK8新增的时间对象都是不可变的, 如果我们修改, 减少,增加了时间, 那么调用者是不会发生改变的, 而是产生了一个新的时间.

 //获取当前时间ZonedDateTime对象 带时区的时间
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println(now);
        //获取指定时间ZonedDateTime对象
        ZonedDateTime shanghai = ZonedDateTime.of(2023, 1, 1, 12, 01, 20, 0, ZoneId.of("Asia/Shanghai"));
        System.out.println(shanghai);
        //修改时间的方法
        ZonedDateTime d1840 = now.withYear(1840);
        System.out.println(d1840);
        //减少时间的方法
        ZonedDateTime d20b = now.minusYears(20L);
        System.out.println(d20b);

2, 日期格式化类:SimpleDateFormat

DateTimeFormatter类 用于时间的格式化和解析

static DateTimeFormatter ofPattern(格式) 获取格式对象

String format(时间对象) 按照指定方式格式化

  //获取带时区的时间对象
        ZonedDateTime Time = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
        //获取格式对象        ***年月日 时分秒 星期 上下午***
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss EE a");
        //按照指定方式格式化
        String format = dtf.format(Time);
        System.out.println(format);

P 173 - 3,日历类: Calendar

LocalDate : 年,月,日

LocalTime : 时,分,秒 (只关注时间, 比较精确)

LocalDateTime : 年,月,日,时,分,秒

MonthDay : 月日类, (只有日和月,比如生日)

和上面的日历类用法差不多

4, 工具类

Duration : 时间间隔 (秒, 纳秒)

Period : 时间间隔 (年,月,日)

ChronoUnit : 时间间隔 (所有单位)

public class ChronoUnitDemo {
    public static void main(String[] args) {
        //现在的日期
        LocalDate now = LocalDate.now();
        //生日
        LocalDate birthDay = LocalDate.of(2000, 1, 1);
        //计算时间间隔 静态方法
        System.out.println(ChronoUnit.YEARS.between(birthDay, now) + "年");
        System.out.println(ChronoUnit.MONTHS.between(birthDay, now) + "月");
        System.out.println(ChronoUnit.DAYS.between(birthDay, now) + "天");
        System.out.println("------------");
        long days = ChronoUnit.DAYS.between(birthDay, now);
        System.out.println(getChrono(days));
        
    }
    //输出大概过了多少年月日
    public static String getChrono(long date) {
        long years = date / 365;
        long months = date % 365 / 30;
        long days = date % 365 % 12;
        return " " + years + "年" + months + "月" + days + "天";
    }
}

P174 包装类

用一个对象把数据包起来

  1. 包装类就是基本数据类型所对应的对象

  2. JKD5后对包装类新增了自动装箱/拆箱功能

  3. 如何获取包装类对象: 不需要new,不需要调用方法,直接赋值即可

     public static void main(String[] args) {
            //Integer的自动装箱/拆箱
            //自动装箱
            Integer i1 = 10;
            //自动拆箱
            Integer i2 = new Integer(20);
            int int3 = i2;
            //直接计算就行
            Integer i4 = i1 + i2;
        }
    

    进制转换

    public static Integer.toXxxString(int i)

//进制转换
        //DEC -> BIN二进制
        System.out.println(Integer.toBinaryString(100));
        //DEC -> OCT八进制
        System.out.println(Integer.toOctalString(100));
        //DEC -> HEX十六进制
        System.out.println(Integer.toHexString(100));
        //将字符串类型的整数转成int类型
        int anInt = Integer.parseInt("100");
        System.out.println(anInt + 1);//101
        //将字符串类型转成boolean类型
        String s = "true";
        boolean b = Boolean.parseBoolean(s);
        if (b) {
            System.out.println("b is boolean type.");
        }    

改进键盘录入

当我们使用next, nextInt, nextDouble在接收数据时, 遇到空格, 回车, 制表符时就停止了,但是我们想要的是接收一整行的数据, 所以我们要想键盘录入, 不管什么类型, 统一使用nextLine,他的特点是遇到回车才停止

 //改进键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个整数:");
        //nextLine,他的特点是录入一整行数据,遇到回车才停止.
        String s1 = sc.nextLine();
        //类型转换
        String regex = "\\d+";
        boolean matches = s1.matches(regex);
        //判断只能输入整数
        if (matches){
            int i = Integer.parseInt(s1);
            System.out.println(i);
        }else System.out.println("只能输入整数.");

P175 综合练习

1.键盘录入

键盘录入一些1~100之间的整数, 平添加到集合中. 直到集合中所有数据和超过200为止.

public static void main(String[] args) {
        //创建集合
        ArrayList<Integer> arrayList = new ArrayList<>();
        //获得随机数
        Random r = new Random();

        while (getSum(arrayList) <= 200) {
            int i = r.nextInt(100) + 1;
            arrayList.add(i);
            System.out.println(i);
        }
        System.out.println("集合的总和:"+getSum(arrayList));
    }

    //计算集合中数据的总和方法
    public static int getSum(ArrayList<Integer> list) {
        //创建总和变量
        int sum = 0;
        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            //得到每个元素, 并累加
            Integer integer = list.get(i);
            sum += integer;
        }
        return sum;
    }

2.算法水题 parseInt

自己实现parseInt方法的效果, 将字符串形式的数据转成整数.

要求:

字符串中只能是数字不能是其它字符

最少一位, 最多10位

0不能开头

public static void main(String[] args) {
        String s = "123456789";
        int i = parseInt(s);
        System.out.println(i);
    }
    //将字符串形式的数据转成整数     "123" -> 1 2 3
    public static int parseInt(String s){
        //结果int变量
        int result = 0;
        //遍历字符串
        for (int i = 0; i < s.length(); i++) {
            //获得每一个字符
            char c = s.charAt(i);
            //"0" = 48 把char字符转换成int
            int i1 = c - 48;
            //计算结果
            result = result * 10 + i1;
        }
        return result;
    }

3.算法水题 toBinaryString

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

提示: 除基取余法

不断的除以基数 (几进制,基数就是几) 得到余数, 直到商为零, 再将余数倒着拼起来即可.

2|6

​ 2|3商---0余

​ 2|1商---1余

​ |0商---1余

public static void main(String[] args) {
        int i = 100;
        System.out.println(toBinaryString(i));
    }

    //DEC -> BIN    int -> String
    public static String toBinaryString(int i) {
        //结果变量
        String bin = "";
        while (i != 0) {
            int r = i % 2;//Remainder 得到 余数
            i /= 2;//Quotient 得到 商
            //倒着拼接字符串
            bin = r + bin;
        }
        return bin;
    }

4.算法水题 活了多少天

请使用代码实现计算你活了多少天, 用JKD7和JKD两种方式完成.

public static void main(String[] args) throws ParseException {
        //由字符串解析成Date对象
        int year = 1985;
        System.out.println(isLeapYearJ7(year));//JDK7方法
        System.out.println("-----------");
        System.out.println(isLeapYearJ8(year));//JDK8方法

    }

    //isLeapYear JDK7
    public static boolean isLeapYearJ7(int year) throws ParseException {
        //闰年有2月29日,平年2月29日就是3月1日,
        String date = year + "-02-29";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = sdf.parse(date);
        //再格式化成字符串
        String format = sdf.format(parse);
        //格式化的字符串
        System.out.println(format);
        //原始的字符串
        System.out.println(date);
        //两个字符串比较是否内容相同,相同就是闰年
        return date.equals(format);
    }

    //isLeapYear JDK8
    public static boolean isLeapYearJ8(int year) {
        //获得当前年份和下一年的1月1日的对象,
        LocalDate ofYear = LocalDate.of(year, 1, 1);
        LocalDate of = LocalDate.of(year + 1, 1, 1);
        //计算这两个对象间隔多少天
        long days = ChronoUnit.DAYS.between(ofYear, of);
        //如果是366天,当前年份就是闰年
        return days == 366 ? true : false;
    }

5.算法水题 闰年

判断任意一年是闰年还是平年

要求: 用JKD7和JKD两种方式判断

提示: 二月有29天是闰年 或者 一年有366天是闰年

public static void main(String[] args) throws ParseException {
        //JDK7
        //现在的时间
        Date now = new Date();
        System.out.println(now);
        //生日的时间
        String s = "1981,2,26 06:00:00";
        //解析字符串得到时间对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy,MM,dd HH:mm:ss");
        Date birthday = sdf.parse(s);
        System.out.println(birthday);
        //获得对象的毫秒值,再相减得到天数
        long nowTime = now.getTime();
        long birthdayTime = birthday.getTime();
        long days = (nowTime - birthdayTime) / 1000 / 60 / 60 / 24;
        System.out.println(days+"天");

        System.out.println("--------------");
        //JDK8
        LocalDate now1 = LocalDate.now();
        LocalDate of = LocalDate.of(1981, 2, 26);
        long between = ChronoUnit.DAYS.between(of, now1);
        System.out.println(between+"天");
    }

标签:11,12,String,System,Date,API,println,JavaSE,out
From: https://www.cnblogs.com/lg369/p/17967029

相关文章

  • JavaSE(13) - 常见算法 algorithm
    JavaSE(13)-常见算法algorithm查找算法Search基本查找BasicSearchpackagealgorithm.search;/*BasicSearch1.用基本查找,查找某个元素在数组中的索引(不考虑重复元素)2.用基本查找,查找某个元素在数组中的索引(考虑重复元素)*/publicclassBasicSearch{public......
  • 1月12日总结
    两天有空,继续更新一篇有关eBPFBCC框架尾调用的内容。eBPF技术很新,能够参考的中文资料很少,而对于BCC框架而言,优秀的中文介绍和教程更是凤毛麟角。我尝试去网上检索有关尾调用的中文资料,BCC框架的几乎没有。即使找到了,这些资料也难以给出可供参考和正确运行的例子。BCC框......
  • MySQL-12.MySQL数据类型
    1.MySQL中的数据类型常见数据类型的属性,如下2.整数类型2.1类型介绍整数类型一共有5种,包括TINYINT,SMALLINT,MEDIUMINT,INT(INTEGER)和BIGINT。它们的区别如下表所示2.2可选属性整数类型的可选属性有三个2.2.1MM:显示宽度,M的取值范围是(0,255)。例如,int(5):当数据宽度小......
  • Stream API
    StreamAPI概念:StreamAPI是Java8中处理集合的关键抽象概念,StreamAPI允许开发人员在不改变原始数据源的情况下对集合进行操作(查找、过滤、数据映射等等),这使得代码更加简洁、易读和可维护。总之,StreamAPI提供了一种高效且易于使用的数据处理方式注意点:Stream不会存储数据......
  • FastAPI学习-28 alembic数据迁移报错:Target database is not up to date 报错解决办法
    前言当表结构有变更,数据迁移时,出现报错:Targetdatabaseisnotuptodate遇到的问题执行迁移命令alembicrevision--autogenerate-m"testv4"出现如下报错>alembicrevision--autogenerate-m"testv4"INFO[alembic.runtime.migration]ContextimplMySQLImpl.INF......
  • 4412 设备树 qt busybox , ctrl+c 无法终止 程序
    问题: 在系统中,ctrl+c无法终止程序。背景: 软件:迅为网盘设备树镜像。硬件:迅为4412板卡。  网上的截图:   我自己的改动如下;     结果显示: ......
  • CodeForces 1266F Almost Same Distance
    洛谷传送门CF传送门好厉害。特判\(k=1\)。首先经过观察,我们可以按照\(k\)的奇偶性讨论:\(k\)为偶数,有一个中心点挂了若干条长度为\(\frac{k}{2}\)的链。\(k\)为偶数,有两个中心点,两边挂了若干条长度为\(\frac{k}{2}\)的链;\(k\)为奇数,有一个中心点挂了若干条长度......
  • 12、nginx日志配置
    1.nginx日志指令log_format:用于设置日志格式access_log:用于指定日志文件存放路径、格式、缓存大小可设置在http、server块中2.log_format2.1log_format语法log_formatnameformat[format...]name表示定义的格式名称format表示定义的格式样式。log_forma......
  • Threat Simulator (威胁仿真器) 23.12.2 - 入侵与攻击仿真(BAS)平台
    ThreatSimulator(威胁仿真器)23.12.2-入侵与攻击仿真(BAS)平台连续验证您的安全态势,有效抵御最新威胁请访问原文链接:ThreatSimulator(威胁仿真器)23.12.2-入侵与攻击仿真(BAS)平台,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgThreatSimulator威胁仿真器......
  • API可视化编排如何实现
    企业随着前后端分离架构、微服务架构、中台战略、产业互联互通的实施必将产生大量的各种协议的API服务,API将成为企业的数字化资产且API会越来越多, API服务之间的相互调用和依赖情况也随之越来越多和复杂。业务系统与业务系统之间、关联企业之间的API都相应存在大量的API相互调用......