日期类
第一代日期类
1.Date类
:精确到毫秒,代表特定的瞬间
2.SimpleDateFormat类
:格式和解析日期的类 SimpleDateFormat
格式化和解析日期的具体类。它允许进行格式化【日期 --> 文本】,解析【文本 --> 日期】和规范化
3.SimpleDateFormat
类需要掌握方法【format
:格式形式 parse
:转换解析【就是将字符串日期格式转成Date
类】】
4.一般情况下Date
类和SimpleDateFormat
类一起搭配使用
Date
和SimpleDateFormat
类案例演示
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
类继承关系图
Calendar
类会使用相关的字段即可
下面如果我们需要按照 24 小时进行来获取时间,Calendar.HOUR
【这是十二进制】 == 改成 ==》Calendar.HOUR_OF_DAY
【这是二十四进制 】
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
存在问题是:
- 可变性:像日期和时间这样的类应该是不可变的
- 偏移性:
Date
中的年份是从1900
开始的,而月份都是从0开始 - 格式化:格式化只对
Date
有用,Calendar
则不行 - 此外,它们也不是线程安全的,不能处理闰秒问题【每隔2天,多出
1s
】
第三代日期类:有三个LocalDate
【年月日】LocalTime
【时分秒】 LocalDateTime
【年月日时分秒】是在JDK8
引入的
注意的是:第三代日期类的【LocalDate
和 LocalTime
和 LocalDateTime
这三个类的构造器都是私有的,不能通过 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();
}
第三代日期类更多方法
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.编程题
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.编程题
自己写的代码:
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@[email protected]";
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.编程题
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.编程题
5.分析题