格式化的时间形式的常用模式对应关系如下:
空参构造创造simdateformate对象,默认格式
练习.按照指定格式展示
package kl002;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Date3 {
public static void main(String[] args) throws ParseException {
String str = "2000-11-11";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf1.parse(str);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
String result = sdf2.format(date);
System.out.println(result);
}
}
运行结果:
2000年11月11日
细节:SimpleDateFormat 是 Java 中用于处理日期格式化和解析的类,位于 java.text 包下。它允许你将日期对象(如 java.util.Date 或 java.util.Calendar)按照指定的模式格式化为字符串,也可以将字符串解析为日期对象。
基本用法
- 格式化日期(Date → String)
- 解析字符串(String → Date)
- 注意事项
线程不安全
SimpleDateFormat 不是线程安全的,在多线程环境下使用时需要注意同步问题,建议每个线程单独创建实例。
时区和语言环境
默认使用系统时区和语言环境,可通过 setTimeZone() 和构造函数指定:
4.异常处理
解析字符串时可能抛出 ParseException,必须进行异常处理。
替代方案(Java 8+)
Java 8 引入的 java.time 包(如 LocalDateTime、DateTimeFormatter)提供了更现代化、线程安全的日期时间 API:
练习.秒杀活动
package kl002;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormateDemo1 {
public static void main(String[] args) throws ParseException {
//比较两个时间
//解析时间得到毫秒值
String startstr = "2023年11月11日 0:0:0";
String endstr = "2023年11月11日 0:10:0";
String orderstr = "2023年11月11日 0:01:0";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//解析上面三个时间,得到Date对象
Date startDate = sdf.parse(startstr);
Date endDate = sdf.parse(endstr);
Date orderDate = sdf.parse(orderstr);
//得到三个时间的毫秒值
long startTime = startDate.getTime();
long endTime = endDate.getTime();
long orderTime = orderDate.getTime();
//判断
if (orderTime >= startTime && orderTime <= endTime) {
System.out.println("参加秒杀活动成功");
} else {
System.out.println("参加秒杀活动失败");
}
}
}
运行结果:
参加秒杀活动成功
总结
Calender
Calender概述
细节:Calender是一个抽象类,不能直接创建对象
Calender常用方法
细节:
月份:范围0-11,如果获取出来的是0,那么实际上是1月
总结
- 获取 Calendar 实例
- 获取和设置日期字段
- 日期计算
- 与 Date 类互转
5.格式化输出
通常结合 SimpleDateFormat 或 Java 8+ 的 DateTimeFormatter 使用
注意事项
月份从 0 开始
Calendar.JANUARY 到 Calendar.DECEMBER 的值是 0 到 11,设置和获取月份时需要注意。
线程安全
Calendar 类不是线程安全的,多线程环境下需注意同步问题。
Java 8+ 推荐使用 java.time 包
Java 8 引入的 java.time 包(如 LocalDateTime、ZonedDateTime)提供了更简洁、线程安全的 API
自动装箱:把基本数据类型自动变成其对应的包装类
自动拆箱:把包装类自动变成其对象的基本数据类型
JDK5以后:int和Integer可以看作是同一个东西,因为在内部可以自动转化
包装类.总结
以后要进行键盘录入,统一使用nextline
特点:遇到回车才结束
练习.键盘录入
package kl003;
import java.util.ArrayList;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
//1.创建一个集合用来添加整数
ArrayList<Integer> list = new ArrayList<>();
//2.键盘录入整数添加到集合当中
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入一个整数:");
String numStr = sc.nextLine();
int num = Integer.parseInt(numStr);
//3.过滤异常数据
if (num < 1 || num > 100) {
System.out.println("输入的数字超出范围,请重新输入");
continue;
}
list.add(num);
int sum = getSum(list);
if (sum > 200){
System.out.println("集合中的所有的数据和已经满足需求");
break;
}
}
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i) + " ");
}
}
private static int getSum(ArrayList<Integer> list) {
int sum = 0;
for (int i = 0; i < list.size(); i++) {
int num = list.get(i);
sum = sum + num;
}
return sum;
}
}
运行结果:
请输入一个整数:
1
请输入一个整数:
50
请输入一个整数:
10
请输入一个整数:
100
请输入一个整数:
50
集合中的所有的数据和已经满足需求
1
50
10
100
50
细节与代码总结:
//1.创建一个集合用来添加整数
//2.键盘录入整数添加到集合当中
//3.过滤异常数据
练习.算法水题
package kl003;
public class Test2 {
public static void main(String[] args) {
//定义一个字符串
String str = "123456789";
//2.校验一个字符串
//习惯:过滤异常数据
if (str.matches("[1-9]\\d(0,9)")) {
//错误的数据
System.out.println("数据格式有误");
} else {
//正确的数据
System.out.println("数据格式正确");
//3.定义一个变量,表示最终的结果
int num = 0;
//4.遍历字符串,得到每一个字符
for (int i = 0; i < str.length(); i++) {
int c = str.charAt(i) - '0';
//5.把每一位数字放到num中
num = num * 10 + c;
}
System.out.println(num);
System.out.println(num+1);
}
}
}
运行结果:
数据格式正确
123456789
练习.算法水题
package kl003;
public class Test3 {
public static void main(String[] args) {
System.out.println(toBinaryString(123));
}
public static String toBinaryString(int num) {
//定义一个StringBuilder对象来拼接余数
StringBuilder sb = new StringBuilder();
//利用循环不断的除以2,取余数
//运用死循环
while(true){
if (num == 0){
break;
}
//取余数 %
int remainder = num % 2;
//倒着拼接
sb.insert(0,remainder);
//除以2
num = num / 2;
}
return sb.toString();
}
}
运行结果:
1111011
练习.算法水题
package kl003;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Date;
public class Test4 {
public static void main(String[] args) throws ParseException {
//请使用代码实现计算你活了多少天,用JDK7和JDK8两种方式实现
//JDK7
String birthday = "2005年12月5日";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = sdf.parse(birthday);
long birthdayTime = date.getTime();
//计算当前时间的毫秒值
long todayTime = System.currentTimeMillis();
//计算间隔多少天
long time = todayTime - birthdayTime;
//计算天数
long day = time / 1000 / 60 / 60 / 24;
System.out.println("你活了" + day + "天");
//JDK8
LocalDate ld1 = LocalDate.of(2005,12,5);
LocalDate ld2 = LocalDate.now();
long days = ChronoUnit.DAYS.between(ld1,ld2);
System.out.println("你活了" + days + "天");
}
}
运行结果:
你活了7105天
你活了7105天
练习.算法水题
package kl003;
import java.time.LocalDate;
import java.util.Calendar;
public class Test5 {
public static void main(String[] args) {
//JDK7
//可以把时间设置为2000年3月1日
Calendar c = Calendar.getInstance();
c.set(2000,2,1);
//月份的范围是0-11
//把日期往前推一天
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.of(2000,3,1);
//把时间往前减一天
LocalDate ld2 = LocalDate.of(2000, 3, 1).minusDays(1);
System.out.println(ld2);
//JDK8判断是否是闰年
System.out.println(ld2.isLeapYear());
}
}
运行结果:
29
2000-02-29
true
谢谢观看