首页 > 代码库 > javaSE第十四天

javaSE第十四天

第十四天????92

1. 正则表达式(理解)????92

(1)定义:????92

(2)常见规则????92

A:字符????92

B:字符类????93

C:预定义字符类????93

D:边界匹配器????93

E:Greedy 数量词????93

(3)常见功能:(分别用的是谁呢?)????93

(4)案例????94

A:判断电话号码和邮箱????94

B:按照不同的规则分割数据????95

C:把论坛中的数字替换为*????96

D:获取字符串中由3个字符组成的单词????96

2. Math(掌握)????97

(1)定义:????97

(2)常见方法????97

(3)成员变量????98

(4)案例:????98

A:猜数字小游戏????98

B:获取任意范围的随机数????99

3. Random(理解)????100

(1)定义:????100

(2)构造方法:????100

(3)成员方法:????101

(4)代码演示????101

4. System(掌握)????101

(1)定义:????101

(2)成员方法????101

A:运行垃圾回收器:????102

B:退出jvm????102

C:获取当前时间的毫秒值:????102

D:数组复制:????103

5. BigInteger(理解)????104

(1)说明:????104

(2)构造方法????104

(3)成员方法????104

(4)代码演示:????104

6. BigDecimal(理解)????105

(1)定义:????105

(2)构造方法????105

(3)成员方法:????105

(4)代码演示????105

7. Date/DateFormat(掌握)????106

(1)Date 类的定义:????106

A:构造方法????107

B:成员方法????107

C:日期和毫秒值的相互转换????108

D:案例:你来到这个世界多少天了?????110

(2)DateFormat类的定义:????111

A:构造方法????111

B:日期和字符串的转换(SimpleDateFormat类)????111

C:案例:????112

8. Calendar(掌握)????114

(1)定义:????114

(2)如何得到一个日历对象呢?????114

(3)成员方法????114

A:根据日历字段得到对应的值????114

B:根据日历字段和一个正负数确定是添加还是减去对应日历字段的值????115

C:设置日历对象的年月日????115

(4)方法演示:????115

(5)案例:????116

?

?

?

第十四天

1. 正则表达式(理解)
????(1)定义:

就是符合一定规则的字符串

????(2)常见规则

????????A:字符

????????????x 字符 x。举例:‘a‘表示字符a

????????????\\ 反斜线字符。

????????????\n 新行(换行)符 (‘\u000A‘)

????????????\r 回车符 (‘\u000D‘)

????????????

????????B:字符类

????????????[abc] a、b c(简单类)(只能同时匹配单个字符)

????????????[^abc] 任何字符,除了 ab c(否定)

????????????[a-zA-Z] a到 z AZ,两头的字母包括在内(范围)

????????????[0-9] 0到9的字符都包括

????????????

????????C:预定义字符类

????????????. 任何字符。我的就是.字符本身,怎么表示呢? \.

????????????\d 数字:[0-9]

????????????\w 单词字符:[a-zA-Z_0-9]

????????????????在正则表达式里面组成单词的东西必须由这些东西组成

?

????????D:边界匹配器

????????????^ 行的开头

????????????$ 行的结尾

????????????\b 单词边界

????????????????就是不是单词字符的地方。

????????????????举例:hello world?haha;xixi

????????????

????????E:Greedy 数量词

????????????X? X,一次或一次也没有 ,也就是0次或者1

????????????X* X,零次或多次

????????????X+ X,一次或多次

????????????X{n} X,恰好 n

????????????X{n,} X,至少 n

????????????X{n,m} X,至少 n 次,但是不超过 m

????(3)常见功能:(分别用的是谁呢?)

????????A:判断功能

????????????String类的public boolean matches(String regex)

????????B:分割功能

????????????String类的public String[] split(String regex)

????????C:替换功能

????????????String类的public String replaceAll(String regex,String replacement)

????????????说明:使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串

????????D:获取功能

????????????Pattern和Matcher

????????????????//把规则编译成模式对象

????????????????Pattern p = Pattern.compile("a*b");

????????????????//利用模式对象来生成匹配器对象

????????????????Matcher m = p.matcher("aaaaab");

????????????????

????????????????find():查找是否存在下一个匹配的元素

????????????????group():获取刚才匹配成功的数据

????????????注意事项:调用group() 方法之前,必须先调用find() 方法

????(4)案例

????????A:判断电话号码和邮箱

????

import java.util.Scanner;

/*

* 需求:校验邮箱

*

* 分析:

* ????????A:键盘录入邮箱

* ????????B:定义邮箱的规则

* ????????????1517806580@qq.com

* ????????????liuyi@163.com

* ????????????linqingxia@126.com

* ????????????fengqingyang@sina.com.cn

* ????????????fqy@itcast.cn

* ????????C:调用功能,判断即可

* ????????D:输出结果

*/

public?class RegexTest {

????public?static?void main(String[] args) {

????????//键盘录入邮箱

????????Scanner sc = new Scanner(System.in);

????????System.out.println("请输入邮箱:");

????????String email = sc.nextLine();

????????

????????//定义邮箱的规则

????????//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";

????????String regex = "\\w+@\\w{2,6}(\\.\\w{2,3})+";

????????

????????//调用功能,判断即可

????????boolean?flag = email.matches(regex);

????????

????????//输出结果

????????System.out.println("flag:"+flag);

????}

}

?

????????B:按照不同的规则分割数据

????????????

import java.util.Arrays;

/*

* 需求:我有如下一个字符串:"91 27 46 38 50"

* 请写代码实现最终输出结果是:"27 38 46 50 91"

*

* 分析:

* ????????A:定义一个字符串

* ????????B:把字符串进行分割,得到一个字符串数组

* ????????C:把字符串数组变换成int数组

* ????????D:int数组排序

* ????????E:把排序后的int数组在组装成一个字符串

* ????????F:输出字符串

*/

public?class RegexTest {

????public?static?void main(String[] args) {

????????// 定义一个字符串

????????String s = "91 27 46 38 50";

?

????????// 把字符串进行分割,得到一个字符串数组

????????String[] strArray = s.split(" ");

?

????????// 把字符串数组变换成int数组

????????int[] arr = new?int[strArray.length];

?

????????for (int?x = 0; x < arr.length; x++) {

????????????arr[x] = Integer.parseInt(strArray[x]);

????????}

?

????????// int数组排序

????????Arrays.sort(arr);

?

????????// 把排序后的int数组在组装成一个字符串

????????StringBuilder sb = new StringBuilder();

????????for (int?x = 0; x < arr.length; x++) {

????????????sb.append(arr[x]).append(" ");

????????}

????????//转化为字符串

????????String result = sb.toString().trim();

????????

????????//输出字符串

????????System.out.println("result:"+result);

????}

}

?

????????C:把论坛中的数字替换为*

/*

* 替换功能 String类的public String replaceAll(String regex,String replacement) 使用给定的

* replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

*/

class RegexDemo {

????public?static?void main(String[] args) {

????????// 定义一个字符串

????????String s = "helloqq12345worldkh622112345678java";

?

????????// 我要去除所有的数字,*给替换掉

????????// String regex = "\\d+";

????????// String regex = "\\d";

????????// String ss = "*";

?

????????// 直接把数字干掉

????????String regex = "\\d+";

????????String ss = "";

?

????????String result = s.replaceAll(regex, ss);

????????System.out.println(result);

????}

}

?

????????D:获取字符串中由3个字符组成的单词

import java.util.regex.Matcher;

import java.util.regex.Pattern;

?

/*

* 获取功能:

* 获取下面这个字符串中由三个字符组成的单词

* da?jia?ting?wo?shuo,jin?tian?yao?xia?yu,bu?shang wan zi xi,gao?xing?bu?

*/

class RegexDemo2 {

????public?static?void main(String[] args) {

????????// 定义字符串

????????String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";

????????// 规则

????????String regex = "\\b\\w{3}\\b";

?

????????// 把规则编译成模式对象

????????Pattern p = Pattern.compile(regex);

????????// 通过模式对象得到匹配器对象

????????Matcher m = p.matcher(s);

????????// 调用匹配器对象的功能

????????// 通过find方法就是查找有没有满足条件的子串

????????// public boolean find()

????????// boolean flag = m.find();

????????// System.out.println(flag);

????????// // 如何得到值呢?

????????// // public String group()

????????// String ss = m.group();

????????// System.out.println(ss);

????????//

????????// // 再来一次

????????// flag = m.find();

????????// System.out.println(flag);

????????// ss = m.group();

????????// System.out.println(ss);

????????

????????//如果匹配到值,就返回 true

????????while (m.find()) {

????????????System.out.println(m.group());

????????}

?

????????// 注意:一定要先find(),然后才能group()

????????// IllegalStateException: No match found

????????// String ss = m.group();

????????// System.out.println(ss);

????}

}

?

????

2. Math(掌握)
????(1)定义:

用于数学运算的类

????(2)常见方法

????????A:绝对值:public static int abs(int a)

????????????????

????????B:向上取整:public static double ceil(double a)

????????????????

????????C:向下取整:public static double floor(double a)

????????????????

????????D:两个数据中的大值:public static int max(int a, int b)

????????????????

????????E:a的b次幂:public static double pow(double a, double b)

????????????????

????????F:随机数:public static double random()

?

????????G:四舍五入:public static int round(float a)

????????H:正平方根:public static double sqrt(double a)

(3)成员变量

????????public static final double E = 2.7182818284590452354;

????????public static final double PI = 3.14159265358979323846;

???? (4)案例:

????????A:猜数字小游戏

import java.util.Random;

import java.util.Scanner;

?

/*

* 动态产生一个 1 - 100 之间的数字,记录猜中结果的次数

*/

public?class GuessGame {

?

????

????public?static?void startGame() {

????????Random ran = new Random();

????????

????????//获取到的随机数

????????int?num = ran.nextInt(100) + 1;

????????//定义一个统计变量

????????int?count = 0;

????????

????????while(true) {

????????????Scanner sc = new Scanner(System.in);

????????????System.out.println("你输入你猜中的数字:");

????????????int?n = sc.nextInt();

????????????//每循环一次,count就自增1

????????????count++;

????????????//比较数字

????????????if (num == n) {

????????????????System.out.println("恭喜你," + count + "次就猜中啦,好厉害呀!");

????????????????break;

????????????} else?if (num > n) {

????????????????System.out.println("你猜的数字小了!继续加油吧...");

????????????} else?if (num < n) {

????????????????

????????????????System.out.println("你猜的数字大了!还差一点喔..come on baby.");

????????????}

????????????

????????}

????}

????

}

?

????????B:获取任意范围的随机数

????????????

import java.util.Scanner;

?

/*

* 需求:请设计一个方法,可以实现获取任意范围内的随机数。

*

* 分析:

* ????????A:键盘录入两个数据。

* ????????????int?strat;

* ????????????int end;

* ????????B:想办法获取在startend之间的随机数

* ????????????我写一个功能实现这个效果,得到一个随机数。(int)

* ????????C:输出这个随机数

*/

public?class MathDemo {

????public?static?void main(String[] args) {

????????//

????????Scanner sc = new Scanner(System.in);

????????System.out.println("请输入开始数:");

????????int?start = sc.nextInt();

????????System.out.println("请输入结束数:");

????????int?end = sc.nextInt();

?

????????for (int?x = 0; x < 100; x++) {

????????????// 调用功能

????????????int?num = getRandom(start, end);

????????????// 输出结果

????????????System.out.println(num);

????????}

????}

?

????/*

???? * 写一个功能 两个明确: 返回值类型:int 参数列表:int start,int end 分析:比如两个数为:200 - 300 之间的随机数

???? * 11 - 100 之间随机数的获取: (int)(Math.random() * 100) + 1; 2、同理: 200 -

???? * 300之间随机数为:(int)(Math.random() * 300) + 200; 这真的正确吗? 现在的范围就变为了:[0,300)

???? * 然后加上200 ----[200,500) 这明显不是我们想要的 3、如果更改为: (int)(Math.random() * (300 -

???? * 200 + 1)) + 200; 呢? 现在的范围为:[0,100] 然后 加上 200 ------》 变为了

???? * [200,300],这是我们想要的

???? */

????public?static?int getRandom(int?start, int?end) {

????????// 回想我们讲过的1-100之间的随机数

????????// int number = (int) (Math.random() * 100) + 1;

????????// int number = (int) (Math.random() * end) + start;

????????// 发现有问题了,怎么办呢?

????????int?number = (int) (Math.random() * (end - start + 1)) + start;

????????return?number;

????}

}

?

????

3. Random(理解)
????(1)定义:

用于产生随机数的类

????(2)构造方法:

????????A: public Random()

没有给出种子,用的是默认种子(当前时间的毫秒值),每次产生的随机数不同

????????B: public Random(long seed)

指定种子,给定种子后,每次得到的随机数是相同的

????(3)成员方法:

????????A: public int nextInt() :返回int类型范围内的随机数

????????B: public int nextInt(int n) 返回[0,n)范围内的随机数

(4)代码演示

????????

import java.util.Random;

/*

* Random:产生随机数的类

*

* 构造方法:

* ????????public Random():没有给种子,用的是默认种子,是当前时间的毫秒值

*????????public Random(long seed):给出指定的种子

*????????给定种子后,每次得到的随机数是相同的。

*

* 成员方法:

* ????????public int nextInt():返回的是int类型范围内的随机数

*????????public int nextInt(int n):返回的是[0,n)范围内随机数

*/

class RandomDemo {

????public?static?void main(String[] args) {

????????// 创建对象

????????// Random r = new Random();

????????Random r = new Random(1111);

?

????????for (int?x = 0; x < 10; x++) {

????????????// int?num = r.nextInt();

????????????int?num = r.nextInt(100) + 1;

????????????System.out.println(num);

????????}

????}

}

?

4. System(掌握)
????(1)定义:

系统类,提供了一些有用的字段和方法

????(2)成员方法

???? A:运行垃圾回收器:

public static void gc()

执行System.gc()前,系统会自动调用finalize()方法清除对象占有的资源????

B:退出jvm

public static void exit(int status)

终止当前正在运行的 Java 虚拟机。参数用作状态码;

根据惯例,非 0 的状态码表示异常终止。

?

演示:

/*

* System类包含一些有用的类字段和方法。它不能被实例化。

* 方法:

*????????public static void exit(int status):终止当前正在运行的 Java 虚拟机。

* 参数用作状态码;根据惯例,非 0 的状态码表示异常终止。

*/

class SystemDemo {

????public?static?void main(String[] args) {

????????System.out.println("我们喜欢林青霞(东方不败)");

????????System.exit(0);

????????System.out.println("我们也喜欢赵雅芝(白娘子)");

????}

}

?

????????C:获取当前时间的毫秒值:

????????????????public static long currentTimeMillis()

????????????演示:

????????

/*

* System类包含一些有用的类字段和方法。它不能被实例化。

*

* 方法:

*????????public static long currentTimeMillis():返回以毫秒为单位的当前时间

*/

class SystemDemo {

????public?static?void main(String[] args) {

????????// System.out.println(System.currentTimeMillis());

?

????????// 单独得到这样的实际目前对我们来说意义不大

????????// 那么,它到底有什么作用呢?

????????// 要求:请大家给我统计这段程序的运行时间

????????long?start = System.currentTimeMillis();

????????for (int?x = 0; x < 100000; x++) {

????????????System.out.println("hello" + x);

????????}

????????long?end = System.currentTimeMillis();

????????System.out.println("共耗时:" + (end - start) + "毫秒");

????}

}

?

D:数组复制:

public static void arraycopy(Object src, int srcPos,

???????????????? Object dest, int destPos, int length)

?

从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

????????????????并复制几个元素

????????????演示:

import java.util.Arrays;

?

/*

* System类包含一些有用的类字段和方法。它不能被实例化。

* 方法:

*????????public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

*????????????????从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

*/

class SystemDemo {

????public?static?void main(String[] args) {

????????// 定义数组

????????int[] arr = { 11, 22, 33, 44, 55 };

????????int[] arr2 = { 6, 7, 8, 9, 10 };

?

????????// 请大家看这个代码的意思

????????System.arraycopy(arr, 1, arr2, 2, 2);

????????//结果:[ 11, 22, 33, 44, 55 ]

????????System.out.println(Arrays.toString(arr));

????????//结果:[6, 7, 22, 33, 10]

????????System.out.println(Arrays.toString(arr2));

????}

}

?

5. BigInteger(理解)
????(1)说明:

针对大整数的运算

????(2)构造方法????

????????A: public BigInteger(String s)

????(3)成员方法

????????A:加

????????????????public BigInteger add(BigInteger val)

????????B:减

????????????????public BigInteger subtract(BigInteger val)

????????C:乘

????????????????public BigInteger multiply(BigInteger val)

????????D:除

????????????????public BigInteger divide(BigInteger val)

????????E:返回商和余数的数组:也就是Biginter[0] = 商 Biginter[1] = 余数

????????????????public BigInteger[] divideAndRemainder(BigInteger val)

(4)代码演示:

????????

import java.math.BigInteger;

?

class BigIntegerDemo {

????public?static?void main(String[] args) {

????????BigInteger bi1 = new BigInteger("100");

????????BigInteger bi2 = new BigInteger("50");

?

????????// public BigInteger add(BigInteger val):

????????System.out.println("add:" + bi1.add(bi2));

????????// public BigInteger subtract(BigInteger val):

????????System.out.println("subtract:" + bi1.subtract(bi2));

????????// public BigInteger multiply(BigInteger val):

????????System.out.println("multiply:" + bi1.multiply(bi2));

????????// public BigInteger divide(BigInteger val):

????????System.out.println("divide:" + bi1.divide(bi2));

?

????????// public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组

????????BigInteger[] bis = bi1.divideAndRemainder(bi2);

????????System.out.println("商:" + bis[0]);

????????System.out.println("余数:" + bis[1]);

????}

}

?

6. BigDecimal(理解)
????(1)定义:

floatdouble)浮点数据做运算,会丢失精度。所以,

针对浮点数据的操作建议采用BigDecimal(金融相关的项目)

????(2)构造方法

????????A: public BigDecimal(String s)

????(3)成员方法:

????????A:加

????????????public BigDecimal add(BigDecimal augend)

????????B:减

????????????public BigDecimal subtract(BigDecimal subtrahend)

????????C:乘

????????????public BigDecimal multiply(BigDecimal multiplicand)

????????D:除

????????????public BigDecimal divide(BigDecimal divisor)

????????E:自己保留小数几位

public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

参数列表说明:divisor:商

Scale:保留几位小数

???? roundingMode:取舍模式(一般为BigDecimal.ROUND_HALF_UP

(4)代码演示

import java.math.BigDecimal;

?

class BigDecimalDemo {

????public?static?void main(String[] args) {

????????/*

???????? *

???????? * 看程序写结果:结果和我们想的有一点点不一样,这是因为float类型的数据存储和整数不一样导致的。它们大部分的时候,都是带有有效数字位。

???????? *

???????? * 由于在运算的时候,float类型和double很容易丢失精度,演示案例。所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal

???????? *

???????? * BigDecimal类:不可变的、任意精度的有符号十进制数,可以解决数据丢失问题。

???????? */

//????????System.out.println(0.09 + 0.01); //0.09999999999999999

//????????System.out.println(1.0 - 0.32);//0.6799999999999999

//????????System.out.println(1.015 * 100);//101.49999999999999

//????????System.out.println(1.301 / 100);// 0.013009999999999999

????????

????????//为了解决上面丢失精度的问题,需要使用 BigDecimal

????????BigDecimal bd1 = new BigDecimal("0.09");

????????BigDecimal bd2 = new BigDecimal("0.01");

????????//相加运算

????????System.out.println("add:" + bd1.add(bd2));

????????System.out.println("-------------------");

?

????????BigDecimal bd3 = new BigDecimal("1.0");

????????BigDecimal bd4 = new BigDecimal("0.32");

????????//想减运算

????????System.out.println("subtract:" + bd3.subtract(bd4));

????????System.out.println("-------------------");

?

????????BigDecimal bd5 = new BigDecimal("1.015");

????????BigDecimal bd6 = new BigDecimal("100");

????????//相乘运算

????????System.out.println("multiply:" + bd5.multiply(bd6));

????????System.out.println("-------------------");

?

????????BigDecimal bd7 = new BigDecimal("1.301");

????????BigDecimal bd8 = new BigDecimal("100");

????????//相除运算

????????System.out.println("divide:" + bd7.divide(bd8));

????????//自己指定保留几位小数,和取舍模式

????????System.out.println("divide:" + bd7.divide(bd8, 3, BigDecimal.ROUND_HALF_UP));

????????System.out.println("divide:" + bd7.divide(bd8, 8, BigDecimal.ROUND_HALF_UP));

????}

}

?

7. Date/DateFormat(掌握)
????(1)Date 类的定义:

Date是日期类,可以精确到毫秒。

????????A:构造方法

????????????public Date() 根据当前的默认(系统)毫秒值创建日期对象

????????????public Date(long date) 根据给定的毫秒值创建日期对象

????????????代码演示:

????????????

import java.util.Date;

?

/*

* Date:表示特定的瞬间,精确到毫秒。

*

* 构造方法:

* ????????Date():根据当前的默认毫秒值创建日期对象

* ????????Date(long date):根据给定的毫秒值创建日期对象

*/

class DateDemo {

????public?static?void main(String[] args) {

????????// 用无参构造方法创建对象

????????Date d = new Date();

????????System.out.println("d:" + d);

?

????????// 用给定的毫秒值创建对象

????????// long time = System.currentTimeMillis();

????????long?time = 1000 * 60 * 60; // 1小时

????????Date d2 = new Date(time);

????????System.out.println("d2:" + d2);

????}

}

?

????????B:成员方法

????????????public long getTime() 获取当前系统时间的毫秒值,以毫秒为单位

????????????public void setTime(long time) :用毫秒值设置时间

????????????代码演示:

????????????

import java.util.Date;

?

/*

* public long getTime():获取时间,以毫秒为单位

* public void setTime(long time):设置时间

* ????????????????????????注意事项:需要注意全球时区的不同,造成的时差

*

* Date得到一个毫秒值

* ????????getTime()

* 把一个毫秒值转换为Date

* ????????构造方法

* ????????setTime(long time)

*/

class DateDemo {

????public?static?void main(String[] args) {

????????// 创建对象

????????Date d = new Date();

?

????????// 获取时间

????????long?time = d.getTime();

????????System.out.println(time);

????????// System.out.println(System.currentTimeMillis());

?

????????System.out.println("d:" + d);

????????// 设置时间,这里需要注意时区的问题

????????d.setTime(1000);

????????System.out.println("d:" + d);

????}

}

?

????????C:日期和毫秒值的相互转换

????????????????

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

?

/*

* Date???? --???? String(格式化)

* ????????public final String format(Date date)

*

* String -- Date(解析)

* ????????public Date parse(String source)

*

* DateForamt:可以进行日期和字符串的格式化和解析,但是由于是抽象类,所以使用具体子类SimpleDateFormat

*

* SimpleDateFormat的构造方法:

* ????????SimpleDateFormat():默认模式

* ????????SimpleDateFormat(String pattern):给定的模式

* ????????????这个模式字符串该如何写呢?

* ????????????通过查看API,我们就找到了对应的模式

* ???????????? y

* ???????????? M????

* ???????????? d

* ???????????? H

* ???????????? m

* ???????????? s

*

* ????????????2014121212:12:12

*/

public?class DateTest3 {

?

????public?static?void main(String[] args) {

?

????????// 创建日期对象

????????Date date = new Date();

????????// Date ----> String

????????dateToString(date);

?

????????// String ----> Date

????????String nowtime = "2016-12-09 15:36:25";

????????stringToDate(nowtime);

?

????}

?

????/**

???? * 将具有指定格式的字符串解析为 Date对象

???? *

???? * @param time

???? */

????public?static?void stringToDate(String time) {

????????// 创建格式化对象

????????SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

?

????????// 将字符串解析为Date

????????Date date = null;

????????try {

????????????date = sdf.parse(time);

????????} catch (ParseException e) {

?

????????????e.printStackTrace();

????????}

????????System.out.println(date);

????}

?

????/**

???? * Date对象 格式化为 String对象(可以方便读取的时间字符串)

???? *

???? * @param date

???? */

????public?static?void dateToString(Date date) {

?

????????// 创建格式化对象

????????// SimpleDateFormat()

????????SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH:mm:ss");

?

????????// 将日期对象进行格式化

????????// public final String format(Date date)

????????String nowTime = sdf.format(date);

????????// 输出格式化后的字符串

????????System.out.println(nowTime);

?

????}

}

?

????????D:案例:你来到这个世界多少天了?

????

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Scanner;

?

/*

* 案例:算一下你来到这个世界多少天?

*

* 分析:

* ????????A:键盘录入你的出生的年月日

* ????????B:把该字符串转换为一个日期

* ????????C:通过该日期得到一个毫秒值

* ????????D:获取当前时间的毫秒值

* ????????E:D-C得到一个毫秒值

* ????????F:E的毫秒值转换为年

* ????????????/1000/60/60/24

*/

class MyYearOldDemo {

????public?static?void main(String[] args) throws ParseException {

????????// 键盘录入你的出生的年月日

????????Scanner sc = new Scanner(System.in);

????????System.out.println("请输入你的出生年月日:");

????????String line = sc.nextLine();

?

????????// 把该字符串转换(解析)为一个日期

????????SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

????????Date d = sdf.parse(line);

?

????????// 通过该日期得到一个毫秒值

????????long?myTime = d.getTime();

?

????????// 获取当前时间的毫秒值

????????long?nowTime = System.currentTimeMillis();

?

????????// D-C得到一个毫秒值

????????long?time = nowTime - myTime;

?

????????// E的毫秒值转换为年

????????long?day = time / 1000 / 60 / 60 / 24;

?

????????System.out.println("你来到这个世界:" + day + "");

????}

}

?

(2)DateFormat类的定义:

DateFormat针对日期进行格式化和针对字符串进行解析的类,但是是抽象类

所以使用其子类SimpleDateFormat

????????A:构造方法

????????????????public SimpleDateFormat():默认模式

????????????????public SimpleDateFormat(String pattern):给定模式

???????????? 常用模式:yyyy-MM-dd HH:mm:ss

????????B:日期和字符串的转换(SimpleDateFormat类)

????????????a:Date -? String

????????????????public final String format(Date date)

????????????????

????????????b:String ?-- Date

????????????????public Date parse(String source)

c:代码演示:

????????????

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

?

/*

* Date???? --> String(格式化)

* ????????public final String format(Date date)

*

* String --> Date(解析)

* ????????public Date parse(String source)

*

* DateForamt:可以进行日期和字符串的格式化和解析,但是由于是抽象类,

* ???????????? 所以使用具体子类SimpleDateFormat

*

* SimpleDateFormat的构造方法:

* ????????SimpleDateFormat():默认模式

* ????????SimpleDateFormat(String pattern):给定的模式

* ????????????这个模式字符串该如何写呢?

* ????????????通过查看API,我们就找到了对应的模式

* ???????????? y

* ???????????? M????

* ???????????? d

* ???????????? H

* ???????????? m

* ???????????? s

*

* ????????????2014121212:12:12

*/

class DateFormatDemo {

????public?static?void main(String[] args) throws ParseException {

????????// Date -- String

????????// 创建日期对象

????????Date d = new Date();

????????// 创建格式化对象(无参),没有给定模式

????????// SimpleDateFormat sdf = new SimpleDateFormat();

????????// 给定模式

????????SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH:mm:ss");

????????// public final String format(Date date)

????????String s = sdf.format(d);

????????System.out.println(s);

?

????????// String -- Date

????????String str = "2008-08-08 12:12:12";

????????// 在把一个字符串解析为日期的时候,请注意格式必须和给定的字符串格式匹配

????????SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

????????Date dd = sdf2.parse(str);

????????System.out.println(dd);

????}

}

?

????????C:案例:

????????????制作了一个针对日期操作的工具类。

????

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

?

/**

* 这是日期和字符串相互转换的工具类

*

* @author 风清扬

*/

class DateUtil {

????private DateUtil() {

????}

?

????/**

???? * 这个方法的作用就是把日期转成一个字符串

???? *

???? * @param d

???? * 被转换的日期对象

???? * @param format

???? * 传递过来的要被转换的格式

???? * @return 格式化后的字符串

???? */

????public?static String dateToString(Date d, String format) {

????????// SimpleDateFormat sdf = new SimpleDateFormat(format);

????????// return sdf.format(d);

????????return?new SimpleDateFormat(format).format(d);

????}

?

????/**

???? * 这个方法的作用就是把一个字符串解析成一个日期对象

???? *

???? * @param s

???? * 被解析的字符串

???? * @param format

???? * 传递过来的要被转换的格式

???? * @return 解析后的日期对象

???? * @throws ParseException

???? */

????public?static Date stringToDate(String s, String format) throws ParseException {

????????return?new SimpleDateFormat(format).parse(s);

????}

}

?

8. Calendar(掌握)
????(1)定义:

日历类,封装了所有的日历字段值,通过统一的方法根据传入不同的日历字段可以获取值。

????(2)如何得到一个日历对象呢?

????????Calendar rightNow = Calendar.getInstance();

????????本质返回的是子类对象

????(3)成员方法

????????A:根据日历字段得到对应的值

????????????????public int get(int field)

????????????????常用的日历字段:

年:Calendar.YEAR

月:Calendar.MONTH

日:Calendar.DATE

?

????????????代码演示:

?

import java.util.Calendar;

?

/*

* Calendar:它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR

* ????????????日历字段之间的转换提供了一些方法,

* ????????????并为操作日历字段(例如获得下星期的日期)提供了一些方法。

*

* public int get(int field):返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是int类型。

*/

class CalendarDemo {

????public?static?void main(String[] args) {

????????// 其日历字段已由当前日期和时间初始化:

????????Calendar rightNow = Calendar.getInstance(); // 子类对象

?

????????// 获取年

????????int?year = rightNow.get(Calendar.YEAR);

????????// 获取月

????????int?month = rightNow.get(Calendar.MONTH);

????????// 获取日

????????int?date = rightNow.get(Calendar.DATE);

?

????????System.out.println(year + "" + (month + 1) + "" + date + "");

????}

}

?

/*Calendar.getInstance(); 返回的对象是子类对象的解释

* abstract class Person {

* ????????public static Person getPerson() {

* ????????????return new Student();

* }

* }

* class Student extends Person {

*

* }

*/

?

?

?

????????B:根据日历字段和一个正负数确定是添加还是减去对应日历字段的值

????????????????public void add(int field, int amount)

????????C:设置日历对象的年月日

????????????????public final void set(int year, int month, int date)

(4)方法演示:

????

import java.util.Calendar;

?

/*

* public void add(int field,int amount):根据给定的日历字段和对应的时间,

????????????????????????????????????????????来对当前的日历进行操作。

* public final void set(int year,int month,int date):设置当前日历的年月日

*/

class CalendarDemo {

????public?static?void main(String[] args) {

????????// 获取当前的日历时间

????????Calendar c = Calendar.getInstance();

?

????????// 获取年

????????int?year = c.get(Calendar.YEAR);

????????// 获取月

????????int?month = c.get(Calendar.MONTH);

????????// 获取日

????????int?date = c.get(Calendar.DATE);

????????System.out.println(year + "" + (month + 1) + "" + date + "");

?

????????// // 三年前的今天

????????// c.add(Calendar.YEAR, -3);

????????// // 获取年

????????// year = c.get(Calendar.YEAR);

????????// // 获取月

????????// month = c.get(Calendar.MONTH);

????????// // 获取日

????????// date = c.get(Calendar.DATE);

????????// System.out.println(year + "" + (month + 1) + "" + date + "");

?

????????// 5年后的10天前

????????c.add(Calendar.YEAR, 5);

????????c.add(Calendar.DATE, -10);

????????// 获取年

????????year = c.get(Calendar.YEAR);

????????// 获取月

????????month = c.get(Calendar.MONTH);

????????// 获取日

????????date = c.get(Calendar.DATE);

????????System.out.println(year + "" + (month + 1) + "" + date + "");

????????System.out.println("--------------");

????????//设置当前日历的时间(包含年月日)

????????c.set(2011, 11, 11);

????????// 获取年

????????year = c.get(Calendar.YEAR);

????????// 获取月

????????month = c.get(Calendar.MONTH);

????????// 获取日

????????date = c.get(Calendar.DATE);

????????System.out.println(year + "" + (month + 1) + "" + date + "");

????}

}

?

????????

(5)案例:

????????计算任意一年的2月份有多少天?

?

import?java.util.Calendar;

import java.util.Scanner;

?

/*

* 案例:获取任意一年的二月有多少天

* ????????(所用的方法很巧妙)

*

* 分析:

* ????????A:键盘录入任意的年份

* ????????B:设置日历对象的年月日

* ????????????年就是A输入的数据

* ????????????月是2

* ????????????日是1

* ????????C:把时间往前推一天,就是2月的最后一天

* ????????D:获取这一天输出即可

*/

class CalendarTest {

????public?static?void main(String[] args) {

????????// 键盘录入任意的年份

????????Scanner sc = new Scanner(System.in);

????????System.out.println("请输入年份:");

????????int?year = sc.nextInt();

?

????????// 设置日历对象的年月日

????????Calendar?c = Calendar.getInstance();

????????c.set(year, 2, 1); // 其实是这一年的31

????????// 把时间往前推一天,就是2月的最后一天

????????c.add(Calendar.DATE, -1);

?

????????// 获取这一天输出即可

????????System.out.println(c.get(Calendar.DATE));

????}

}

javaSE第十四天