JAVA日期类

日期类
第一代日期类

1.Date类:精确到毫秒,代表特定的瞬间

2.SimpleDateFormat类:格式和解析日期的类 SimpleDateFormat格式化和解析日期的具体类。它允许进行格式化【日期 --> 文本】,解析【文本 --> 日期】和规范化

3.SimpleDateFormat类需要掌握方法【format:格式形式 parse:转换解析【就是将字符串日期格式转成Date类】】

4.一般情况下Date类和SimpleDateFormat类一起搭配使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p0rznzoK-1645968589789)(E:\Typora笔记\java笔记\img\image-20220213123731452.png)]

DateSimpleDateFormat类案例演示
package wrapper_;

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

/**
 * @author: 海康
 * @version: 1.0
 */
public class date_Date01 {
    public static void main(String[] args) throws ParseException {
        /**
         * 1.获取当前系统时间
         * 2.这里的Date类是在java.util包
         * 3.默认输出的日期格式是国外的方式,因此通常需要对格式进行转换
         */
        Date date = new Date();//获取当前系统时间
        System.out.println("当前系统日期="+date);

        // 通过指定毫秒数得到时间
        Date date1 = new Date(1688688888);//通过指定毫秒数得到时间
        System.out.println("通过指定毫秒获取某个时间="+date1);//获取某个时间对应的毫秒数


        /**
         * SimpleDateFormat类 需要掌握 format方法【是对日期进行格式化的】
         * parse方法 【是对字符串日期进行转成Date类】
         */

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String format = sdf.format(date);// 对date日期进行格式化
        System.out.println("通过format方法转化日期="+format);

        // SimpleDateFormat类中的parse方法【对字符串日期格式进行转化】
        /**
         * 1.可以反一个格式化的String 转成对象的 Date类
         * 2.得到 Date类仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换
         * 3.在把 String ---> Date 类,使用的 sdf对象格式需要和String的格式一致,否则会抛出转换异常【ParseException】
         */
        String date3 = "1998-12-16 17:12:16";
        Date parse = sdf.parse(date3);
        System.out.println("通过字符串日期进行转化="+parse);

        /**
         * 返回值
         * 当前系统日期=Sun Feb 13 13:09:49 CST 2022
         * 通过指定毫秒获取某个时间=Tue Jan 20 21:04:48 CST 1970
         * 通过format方法转化日期=2022-02-13 01:09:49
         * 通过字符串日期进行转化=Wed Dec 16 17:12:16 CST 1998
         */
    }
}
第二代日期类

1.主要就是Calendar类【日历】

public abstract Calendar extends Object implements Serializable,Cloneable ,Comparable<Calendar>{}

2.Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR MONTH DAY_OF_MONTH HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段【例如获得下星期的日期】提供了一些方法

Calendar类继承关系图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YFF6ef63-1645968589790)(E:\Typora笔记\java笔记\img\image-20220213172355221.png)]

Calendar类会使用相关的字段即可

下面如果我们需要按照 24 小时进行来获取时间,Calendar.HOUR 【这是十二进制】 == 改成 ==》Calendar.HOUR_OF_DAY【这是二十四进制 】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pNIRLSux-1645968589791)(E:\Typora笔记\java笔记\img\image-20220213173742774.png)]

Calendar 没有专门的格式化方法,所以需要程序员自己来组合显示

Calendar类案例演示

package wrapper_.date_;

import java.util.Calendar;

/**
 * @author: 海康
 * @version: 1.0
 */
public class Calendar01 {
    public static void main(String[] args) {
        //注意由于 Calendar 是抽象的不能直接 new 实例化,并且构造器是 protected 修饰的
        // 可以 通过 getInstance 来获取 Calendar 实例
//        Calendar calendar = new Calendar();
        Calendar calendar = Calendar.getInstance();//这种方式获取 Calendar 对象
        System.out.println("calendar="+calendar);
       // System.out.println(Calendar.YEAR);//注意不能直接使用 Calendar.YEAR 等相关的字段
        // 【这样获取是获取到默认值,没有与对象相关联】[这样返回是默认值 1]

        // 学会获取相关的字段即可 获取日历对象的某个日历字段
        // 年
        System.out.println("年:"+ calendar.get(Calendar.YEAR));
        // 月 获取月 因为Calendar 返回月时候 是按照 0 开始编号的
        System.out.println("月:"+calendar.get(Calendar.MARCH));
        // 日 获取日
        System.out.println("日:"+calendar.get(Calendar.DAY_OF_MONTH));
        // 获取小时
        System.out.println("小时:"+calendar.get(Calendar.HOUR_OF_DAY));
        // 分钟
        System.out.println("分钟:"+ calendar.get(Calendar.MINUTE));
        // 秒
        System.out.println("秒:"+ calendar.get(Calendar.SECOND));

        // Calender 没有专门的格式化方法,所以需要程序员自己来级合显示
        System.out.println(calendar.get(Calendar.YEAR)+"-"+calendar.get(Calendar.MARCH)+"-"+calendar.get(Calendar.DAY_OF_MONTH)
        + "\t" +calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE)+ ":"+calendar.get(Calendar.SECOND));

        /**
         * 返回值:
         * 年:2022
         * 月:1
         * 日:13
         * 小时:17
         * 分钟:50
         * 秒:24
         * 2022-1-13   17:50:24
         */
    }
}
第三代日期类

由于前面再代日期类的不足分析:

JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK1.1引入 Calendar类之后被弃用了。而Calendar存在问题是:

  1. 可变性:像日期和时间这样的类应该是不可变的
  2. 偏移性:Date中的年份是从 1900开始的,而月份都是从0开始
  3. 格式化:格式化只对Date有用,Calendar则不行
  4. 此外,它们也不是线程安全的,不能处理闰秒问题【每隔2天,多出1s

第三代日期类:有三个LocalDate【年月日】LocalTime【时分秒】 LocalDateTime【年月日时分秒】是在JDK8引入的

注意的是:第三代日期类的【LocalDateLocalTimeLocalDateTime这三个类的构造器都是私有的,不能通过 new进行实例化,要通过类名.now获取对象实例】

LocalDate只包含日期,可以获取日期字段

LocalTime只包含时间,可以获取时间字段

LocalDateTime包含日期+时间 ,可以获取日期和时间字段

package wrapper_.date_;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;

/**
 * @author: 海康
 * @version: 1.0
 */
public class LocalDateTime_ {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();//获取日期类对象
        LocalTime time = LocalTime.now();//获取时间类对象
        LocalDateTime dateTime = LocalDateTime.now();//获取日期时间对象

        //年
        int year = dateTime.getYear();
        System.out.println("年="+year);
        //月 获取月份有两种方式:
        // 方式一:
        Month month = dateTime.getMonth();//获取的返回是英文
        System.out.println("月="+month);
        // 方式二:
        int monthValue = dateTime.getMonthValue();
        System.out.println("月="+monthValue);
        // 日
        int dayOfMonth = dateTime.getDayOfMonth();
        System.out.println("日="+dayOfMonth);
        // 时
        int hour = dateTime.getHour();
        System.out.println("时="+hour);
        //分
        int minute = dateTime.getMinute();
        System.out.println("分="+minute);
        //秒
        int second = dateTime.getSecond();
        System.out.println("秒="+second);

        /**
         * 返回值:
         * 年=2022
         * 月=FEBRUARY
         * 月=2
         * 日=13
         * 时=18
         * 分=41
         * 秒=56
         */
    }
}
DateTimeFormat格式日期类

类似于SImpleDateFormat

DateTimeFormat dtf = DateTimeFormatter.ofPattern(格式);【注意不能直接new实例化,因为构造器是默修饰的,要使用静态方法ofPattern方法进行指定格式】

String str = dtf.format(日期对象);

案例演示:

package wrapper_.date_;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author: 海康
 * @version: 1.0
 */
public class DateTimeFormatter01 {
    public static void main(String[] args) {
        LocalDateTime ldt = LocalDateTime.now();
        //日期格式化:
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //调用DateTimeFormatter类中的 format方法进行日期格式
        String date = dtf.format(ldt);
        System.out.println(date);
        /**
         * 返回值:
         * 2022-02-13 19:08:09
         */
    }
}
Instant时间戳 【构造器是私有化,只能通过Instant.now()方法获取Instant对象】

类似于Date提供了一系列和Date转换的方式

Instant  --> Date
Date date = Date.from(instant);
Date ---> Instant
Instant instant = date.toInstant();

案例演示:
Instant  now = Instant.now();
System.out.println(now);
Date date = Date.from(now);
Instant instant = date.toInstant();
public static void main(String[] args) {
    //获取时间戳对象
    Instant instant = Instant.now();
    Date date = new Date();
    // Instant 转成 Date
    Date from = Date.from(instant);
    // Date 转成 Instant
    Instant toInstant = date.toInstant();
}
第三代日期类更多方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rfLH59zu-1645968589791)(E:\Typora笔记\java笔记\img\image-20220213193443059.png)]

LocalDateTime

MonthDay:检查重复事件

是否是闰年

增加日期的某个部分

使用plus方法测试增加时间的某个部分

使用minus方法测试查看一年前和一年后的日期

package wrapper_.date_;

import javax.swing.text.DateFormatter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author: 海康
 * @version: 1.0
 */
public class LocalTimeFormatter02 {
    public static void main(String[] args) {
        // 使用DateTimeFormatter 对象进行日期格式化
        DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        LocalDateTime dateTime = LocalDateTime.now();
        // 增加 168 天后的日期
        LocalDateTime time1 = dateTime.plusDays(168);
        System.out.println("168天后的日期="+ofPattern.format(time1));

        // 减去 168 分钟的时间
        LocalDateTime dateTime1 = dateTime.minusMinutes(168);
        System.out.println("减去 168 分钟的时间"+ofPattern.format( dateTime1));
        /**
         * 返回值:
         * 168天后的日期=2022-07-31 19:34:03
         * 减去 168 分钟的时间2022-02-13 16:46:03
         */

    }
}
常用类作业

1.编程题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a7fjyWoP-1645968589792)(E:\Typora笔记\java笔记\img\image-20220214100926264.png)]

1.将字符串中指定部分进行反转。比如将"abcdf"反转为"aedcbf"
2.编写方法 public static String reverse(String str,int start,int end)搞定
package wrapper_.execrise;

/**
 * @author: 海康
 * @version: 1.0
 */
public class HomeWork01 {
    public static void main(String[] args) {
        String str = "abcdef";
        String reverse = reverse(str, 1, 4);
        System.out.println(reverse);
    }

    /**
     * @param str
     * @param start
     * @param end
     * @return
     *
     * 将字符串指定的部分进行反转,比如将 "abcdef" 转成 "aedcbf"
     * 思路分析:
     * 把 String 转成 char[] ,因为char[] 的元素是可以交换的
     */
    public static String reverse(String str,int start,int end){
        // 对传入的参数进行检验
        if (str!=null && start<end && end < str.length())
            throw new RuntimeException("传入的参数不正确!");
        char[] chars = str.toCharArray();
        char temp =' ';
        for (int i = start, j= end; i < j; i++,j--) {
            temp = chars[i];
            chars[i] = chars[j];
            chars[j] = temp;
        }
        // 重新构建新的字符串
        return new String(chars);
    }
}

2.编程题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TyClESmD-1645968589792)(E:\Typora笔记\java笔记\img\image-20220214105828519.png)]

自己写的代码:

package wrapper_.execrise;

import java.util.Scanner;

/**
 * @author: 海康
 * @version: 1.0
 */
public class HomeWork02 {
    public static void main(String[] args) {
        userName();
    }

    public static Scanner input(){
        Scanner sc = new Scanner(System.in);
        return sc;
    }

    public static void userName() {
        System.out.println("请输入用户名:");
        String s = input().nextLine();
        System.out.println(s.length());
        if (s.length() != 2 && s.length()!=3 && s.length()!=4){
            throw new RuntimeException("您输入用户名有误");
        }
        userPassword();
    }
    public static void userPassword(){
        System.out.println("请输入密码:");
        String s = input().nextLine();
        if (s.length()!=6)
            throw new NumberFormatException("密码长度不正确");
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (!Character.isDigit(chars[i]))
                throw new NumberFormatException("密码应全是数字");
        }
        userEmail();
    }

    public static void userEmail(){
        System.out.println("请输入邮箱:");
        String s = input().nextLine();
        int i = s.indexOf("@");
        if (i == -1)
            throw new RuntimeException("邮箱应包含“@”符号");
        if (s.indexOf(".") == s.indexOf(i-1))
            throw new RuntimeException("邮箱应“.”应该在“@”符号前");
        System.out.println("注册成功!");
    }
}

老师写代码:

package com.hspedu.homework;


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

        String name = "abc";
        String pwd = "123456";
        String email = "ti@i@sohu.com";

        try {
            userRegister(name,pwd,email);
            System.out.println("恭喜你,注册成功~");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }

    /**
     * 输入用户名、密码、邮箱,如果信息录入正确,则提示注册成功,否则生成异常对象
     * 要求:
     * (1) 用户名长度为2或3或4
     * (2) 密码的长度为6,要求全是数字  isDigital
     * (3) 邮箱中包含@和.   并且@在.的前面
     * <p>
     * 思路分析
     * (1) 先编写方法 userRegister(String name, String pwd, String email) {}
     * (2) 针对 输入的内容进行校核,如果发现有问题,就抛出异常,给出提示
     * (3) 单独的写一个方法,判断 密码是否全部是数字字符 boolean
     */
    public static void userRegister(String name, String pwd, String email) {

        //再加入一些校验
        if(!(name != null && pwd != null && email != null)) {
            throw  new RuntimeException("参数不能为null");
        }

        //过关
        //第一关
        int userLength = name.length();
        if (!(userLength >= 2 && userLength <= 4)) {
            throw new RuntimeException("用户名长度为2或3或4");
        }

        //第二关
        if (!(pwd.length() == 6 && isDigital(pwd))) {
            throw new RuntimeException("密码的长度为6,要求全是数字");
        }

        //第三关
        int i = email.indexOf('@');
        int j = email.indexOf('.');
        if (!(i > 0 && j > i)) {
            throw new RuntimeException("邮箱中包含@和.   并且@在.的前面");
        }
    }

    //单独的写一个方法,判断 密码是否全部是数字字符 boolean
    public static boolean isDigital(String str) {
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] < '0' || chars[i] > '9') {
                return false;
            }
        }
        return true;
    }

}

3.编程题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qPeKmGxr-1645968589793)(E:\Typora笔记\java笔记\img\image-20220214111251670.png)]

package com.hspedu.homework;


public class Homework03 {
    public static void main(String[] args) {
        String name = "Willian Jefferson Clinton";
        printName(name);
    }

    /**
     * 编写方法: 完成输出格式要求的字符串
     * 编写java程序,输入形式为: Han shun Ping的人名,以Ping,Han .S的形式打印
     *       出来    。其中.S是中间单词的首字母
     * 思路分析
     * (1) 对输入的字符串进行 分割split(" ")
     * (2) 对得到的String[] 进行格式化String.format()
     * (3) 对输入的字符串进行校验即可
     */
    public static void printName(String str) {

        if(str == null) {
            System.out.println("str 不能为空");
            return;
        }

        String[] names = str.split(" ");
        if(names.length != 3) {
            System.out.println("输入的字符串格式不对");
            return;
        }

        String format = String.format("%s,%s .%c", names[2], names[0], names[1].toUpperCase().charAt(0));
        System.out.println(format);
    }
}

4.编程题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AQ3AHTYH-1645968589793)(E:\Typora笔记\java笔记\img\image-20220214112503588.png)]

5.分析题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7jirNotJ-1645968589794)(E:\Typora笔记\java笔记\img\image-20220214120816190.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-acluOGYQ-1645968589794)(E:\Typora笔记\java笔记\img\image-20220214123055024.png)]

  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值