JAVA基础知识复习(十一)-日期时间

本文最后更新于:December 3, 2021 pm

JAVA基础知识复习(十一)。

目录

1.Java StringBuffer 和 StringBuilder 类

StringBuffer 类是可变字符串类,创建 StringBuffer 类的对象后可以随意修改字符串的内容。每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了 StringBuffer 类对象的容量,则该对象的容量会自动扩大。

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和String类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

StringBuffer 类支持的主要方法。

方法 方法描述
public StringBuffer append(String s) 将指定的字符串追加到此字符序列。
public StringBuffer reverse() 将此字符序列用其反转形式取代。
public delete(int start, int end) 移除此序列的子字符串中的字符。
public insert(int offset, int i) int 参数的字符串表示形式插入此序列中。
replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。

1.1 创建

StringBuffer 类提供了 3 个构造方法来创建一个字符串。

1.StringBuffer() 构造一个空的字符串缓冲区,并且初始化为 16 个字符的容量。
2.StringBuffer(int length) 创建一个空的字符串缓冲区,并且初始化为指定长度 length 的容量。
3.StringBuffer(String str) 创建一个字符串缓冲区,并将其内容初始化为指定的字符串内容 str,字符串缓冲区的初始容量为 16 加上字符串 str 的长度。

1
2
3
4
5
6
StringBuffer str1 = new StringBuffer();
StringBuffer str2 = new StringBuffer(10);
StringBuffer str3 = new StringBuffer("青春无悔");
System.out.println(str1.capacity()); // 输出 16 str1.capacity() 用于查看 str1 的容量
System.out.println(str2.capacity()); // 输出 10
System.out.println(str3.capacity()); // 输出 20

1.2 追加字符串

StringBuffer 类的 append() 方法用于向原有 StringBuffer 对象中追加字符串。

1
2
3
4
5
6
StringBuffer 对象.append(String str)

StringBuffer buffer = new StringBuffer("hello,"); // 创建一个 StringBuffer 对象
String str = "World!";
buffer.append(str); // 向 StringBuffer 对象追加 str 字符串
// 输出:Hello,World!

1.3 替换字符

StringBuffer 类的 setCharAt() 方法用于在字符串的指定索引位置替换一个字符。

1
2
3
4
5
6
7
8
9
StringBuffer 对象.setCharAt(int index, char ch);

StringBuffer sb = new StringBuffer("hello");
sb.setCharAt(1,'E');
System.out.println(sb); // 输出:hEllo
sb.setCharAt(0,'H');
System.out.println(sb); // 输出:HEllo
sb.setCharAt(2,'p');
System.out.println(sb); // 输出:HEplo

1.4 反转字符串

StringBuffer 类中的 reverse() 方法用于将字符串序列用其反转的形式取代。

1
2
3
4
5
StringBuffer 对象.reverse();

StringBuffer sb = new StringBuffer("java");
sb.reverse();
System.out.println(sb); // 输出:avaj

1.5 删除字符串

StringBuffer 类提供了 deleteCharAt() 和 delete() 两个删除字符串的方法。

1.5.1 deleteCharAt() 方法

deleteCharAt() 方法用于移除(删除)序列中指定位置的字符,然后将剩余的内容形成一个新的字符串。

1
2
3
4
5
StringBuffer 对象.deleteCharAt(int index);

StringBuffer sb = new StringBuffer("She");
sb.deleteCharAt(2);
System.out.println(sb); // 输出:Sh

1.5.2 delete() 方法

delete() 方法用于移除序列中子字符串的字符。该方法的作用是删除指定区域以内的所有字符。

1
2
3
4
5
6
7
8
StringBuffer 对象.delete(int start,int end);
//start 表示要删除字符的起始索引值(包括索引值所对应的字符),end 表示要删除字符串的结束索引值(不包括索引值所对应的字符)。

StringBuffer sb = new StringBuffer("hello jack");
sb.delete(2,5);
System.out.println(sb); // 输出:he jack
sb.delete(2,5);
System.out.println(sb); // 输出:heck

2.Java 日期时间

java.util包提供了Date类来封装当前的日期和时间。 Date类提供两个构造函数来实例化Date对象。

第一个构造函数使用当前日期和时间来初始化对象。

1
Date( )

第二个构造函数接收一个参数,该参数是从1970年1月1日起的微秒数。

1
Date(long millisec)

Date对象创建以后,可以调用的方法。

方法 描述
boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。
boolean before(Date date) 若当调用此方法的Date对象在指定日期之前返回true,否则返回false。
Object clone( ) 返回此对象的副本。
int compareTo(Date date) 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。
int compareTo(Object obj) 若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。
boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。
long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
int hashCode( ) 返回此对象的哈希码值。
void setTime(long time) 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。
String toString( ) 转换Date对象为String表示形式,并返回该字符串。

2.1 获取当前日期时间

使用Date对象的 toString()方法来打印当前日期和时间。
实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Date;

public class DateDemo {
public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();

// 使用 toString() 函数显示日期时间
System.out.println(date.toString());
}
}
/*输出结果*/
Mon May 04 09:51:52 CDT 2013

2.2 日期比较

Java使用三种方法来比较两个日期。

  1. 使用getTime( ) 方法获取两个日期(自1970年1月1日经历的微秒数值),然后比较这两个值。
  1. 使用方法before(),after()和equals()。例如,一个月的12号比18号早,则new Date(99, 2, 12).before(new Date (99, 2, 18))返回true。
  1. 使用compareTo()方法,它是由Comparable接口定义的,Date类实现了这个接口。

2.3 使用SimpleDateFormat格式化日期

SimpleDateFormat是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat允许用户选择任何自定义日期时间格式来运行。
实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.*;
import java.text.*;

public class DateDemo {
public static void main(String args[]) {

Date dNow = new Date( );
SimpleDateFormat ft =
new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

System.out.println("Current Date: " + ft.format(dNow));
}
}
/*输出结果*/
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT

2.3.1 简单的DateFormat格式化编码

字母 描述 示例
G 纪元标记 AD
y 四位年份 2001
M 月份 July or 07
d 一个月的日期 10
h A.M./P.M. (1~12)格式小时 12
H 一天中的小时 (0~23) 22
m 分钟数 30
s 秒数 55
S 微妙数 234
E 星期几 Tuesday
D 一年中的日子 360
F 一个月中第几周的周几 2 (second Wed. in July)
w 一年中第几周 40
W 一个月中第几周 1
a A.M./P.M. 标记 PM
k 一天中的小时(1~24) 24
K A.M./P.M. (0~11)格式小时 10
z 时区 Eastern Standard Time
文字定界符 Delimiter
单引号 `

2.4 使用printf格式化日期

printf方法可以很轻松地格式化时间和日期。使用两个字母格式,它以t开头并且以下面表格中的一个字母结尾。
实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Date;

public class DateDemo {

public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();

// 使用toString()显示日期和时间
String str = String.format("Current Date/Time : %tc", date );

System.out.printf(str);
}
}
/*输出结果*/
Current Date/Time : Sat Dec 15 16:37:57 MST 2012

如果需要重复提供日期,那么利用这种方式来格式化它的每一部分就有点复杂了。因此,可以利用一个格式化字符串指出要被格式化的参数的索引。索引必须紧跟在%后面,而且必须以$结束。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Date;

public class DateDemo {

public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();

// 使用toString()显示日期和时间
System.out.printf("%1$s %2$tB %2$td, %2$tY",
"Due date:", date);
}
}
/*输出结果*/
Due date: February 09, 2004

或者,可以使用 < 标志。它表明先前被格式化的参数要被再次使用。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Date;

public class DateDemo {

public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();

// 显示格式化时间
System.out.printf("%s %tB %<te, %<tY",
"Due date:", date);
}
}
/*输出结果*/
Due date: February 09, 2004

2.5 解析字符串为时间

SimpleDateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.*;
import java.text.*;

public class DateDemo {

public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");

String input = args.length == 0 ? "1818-11-11" : args[0];

System.out.print(input + " Parses as ");

Date t;

try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}
/*输出结果*/
$ java DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007

2.6 休眠(sleep)

可以让程序休眠一毫秒的时间或者到您的计算机的寿命长的任意段时间。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.*;

public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
/*输出结果*/
Sun May 03 18:04:41 GMT 2009

Sun May 03 18:04:44 GMT 2009

2.7 测量时间

实例:测量时间间隔(以毫秒为单位)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;

public class DiffDemo {

public static void main(String args[]) {
try {
long start = System.currentTimeMillis( );
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
long end = System.currentTimeMillis( );
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
/*输出结果*/
Sun May 03 18:16:51 GMT 2009

Sun May 03 18:16:57 GMT 2009

Difference is : 5993

2.8 Calendar类

使用Calendar 类。能设置和获取日期数据的特定部分,比如小时,日,或者分钟。 又可以在日期的这些部分加上或者减去值。

Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。

2.8.1 创建一个代表系统当前日期的Calendar对象

1
Calendar c = Calendar.getInstance();//默认是当前日期

2.8.2 创建一个指定日期的Calendar对象

使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
实例:

1
2
3
//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);

2.8.3 Calendar类对象字段类型

Calendar类中用以下这些常量表示不同的意义。

常量 描述
Calendar.YEAR 年份
Calendar.MONTH 月份
Calendar.DATE 日期
Calendar.DAY_OF_MONTH 日期,和上面的字段意义完全相同
Calendar.HOUR 12小时制的小时
Calendar.HOUR_OF_DAY 24小时制的小时
Calendar.MINUTE 分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK 星期几

2.8.4 Calendar类对象信息的设置

2.8.4.1 Set设置
1
Calendar c1 = Calendar.getInstance();

调用:

1
2
3
public final void set(int year,int month,int date)

c1.set(2009, 6 - 1, 12);//把Calendar对象c1的年月日分别设这为:2009、5、12
2.8.4.2 利用字段类型设置

如果只设定某个字段,例如日期的值,则可以使用如下set方法:

1
public void set(int field,int value)

把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算。

1
c1.set(Calendar.DATE,10);

把c1对象代表的年份设置为2008年,其他的所有数值会被重新计算。

1
c1.set(Calendar.YEAR,2008);

其他字段属性set的意义以此类推。

2.8.5 Add设置

1
Calendar c1 = Calendar.getInstance();

把c1对象的日期加上10,也就是c1所表的日期的10天后的日期,其它所有的数值会被重新计算。

1
c1.add(Calendar.DATE, 10);

把c1对象的日期减去10,也就是c1所表的日期的10天前的日期,其它所有的数值会被重新计算。

1
c1.add(Calendar.DATE, -10);

其他字段属性的add的意义以此类推。

2.8.6 Calendar类对象信息的获得

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

2.9 GregorianCalendar类

Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这些代表公历定义的两个时代。

2.9.1 GregorianCalendar对象的构造方法

构造函数 说明
GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
GregorianCalendar(int year, int month, int date) 在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar
GregorianCalendar(int year, int month, int date, int hour, int minute) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。
GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。
GregorianCalendar(Locale aLocale) 在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar。
GregorianCalendar(TimeZone zone) 在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。
GregorianCalendar(TimeZone zone, Locale aLocale) 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。

2.9.2 GregorianCalendar 类的方法

方法 说明
void add(int field, int amount) 根据日历规则,将指定的(有符号的)时间量添加到给定的日历字段中。
protected void computeFields() 转换UTC毫秒值为时间域值
protected void computeTime() 覆盖Calendar ,转换时间域值为UTC毫秒值
boolean equals(Object obj) 比较此 GregorianCalendar 与指定的 Object。
int get(int field) 获取指定字段的时间值
int getActualMaximum(int field) 返回当前日期,给定字段的最大值
int getActualMinimum(int field) 返回当前日期,给定字段的最小值
int getGreatestMinimum(int field) 返回此 GregorianCalendar 实例给定日历字段的最高的最小值。
Date getGregorianChange() 获得格里高利历的更改日期。
int getLeastMaximum(int field) 返回此 GregorianCalendar 实例给定日历字段的最低的最大值
int getMaximum(int field) 返回此 GregorianCalendar 实例的给定日历字段的最大值。
Date getTime() 获取日历当前时间。
long getTimeInMillis() 获取用长整型表示的日历的当前时间
TimeZone getTimeZone() 获取时区。
int getMinimum(int field) 返回给定字段的最小值。
int hashCode() 重写hashCode.
boolean isLeapYear(int year) 确定给定的年份是否为闰年。
void roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。
void set(int field, int value) 用给定的值设置时间字段。
void set(int year, int month, int date) 设置年、月、日的值。
void set(int year, int month, int date, int hour, int minute) 设置年、月、日、小时、分钟的值。
void set(int year, int month, int date, int hour, int minute, int second) 设置年、月、日、小时、分钟、秒的值。
void setGregorianChange(Date date) 设置 GregorianCalendar 的更改日期。
void setTime(Date date) 用给定的日期设置Calendar的当前时间。
void setTimeInMillis(long millis) 用给定的long型毫秒数设置Calendar的当前时间。
void setTimeZone(TimeZone value) 用给定时区值设置当前时区。
String toString() 返回代表日历的字符串。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.*;

public class GregorianCalendarDemo {

public static void main(String args[]) {
String months[] = {
"Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"};

int year;
// 初始化 Gregorian 日历
// 使用当前时间和日期
// 默认为本地时间和时区
GregorianCalendar gcalendar = new GregorianCalendar();
// 显示当前时间和日期的信息
System.out.print("Date: ");
System.out.print(months[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(year = gcalendar.get(Calendar.YEAR));
System.out.print("Time: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));

// 测试当前年份是否为闰年
if(gcalendar.isLeapYear(year)) {
System.out.println("当前年份是闰年");
}
else {
System.out.println("当前年份不是闰年");
}
}
}
/*输出结果*/
Date: Apr 22 2009
Time: 11:25:27
当前年份不是闰年


本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/2653072026.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!