菜鸟之路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的格式化规则
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);
}
}