格式化的時間形式的常用模式對應關系如下:
空參構造創造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);//除以2num = 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兩種方式實現//JDK7String 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 + "天");//JDK8LocalDate 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-12LocalDate.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
謝謝觀看