一、Math类的常用方法
Java 中的 +、-、*、/ 和 % 等基本算术运算符不能进行更复杂的数学运算,例如,三角函数、对数运算、指数运算等。于是 Java 提供了 Math 工具类来完成这些复杂的运算。
在 Java 中 Math 类封装了常用的数学运算,提供了基本的数学操作,如指数、对数、平方根和三角函数等。Math 类位于 java.lang 包,它的构造方法是 private 的,因此无法创建 Math 类的对象,并且 Math 类中的所有方法都是类方法,可以直接通过类名来调用它们。
1.1.静态常量
Math 类中包含 E 和 PI 两个静态常量,正如它们名字所暗示的,它们的值分别等于 e(自然对数)和 π(圆周率)。案例如下:调用 Math 类的 E 和 PI 两个常量,并将结果输出。代码如下:
public class Test01 {
public static void main(String[] args) {
System.out.println("常量E的值为:"+Math.E);
System.out.println("常量PI的值为:"+Math.PI);
}
}
执行上述代码,输出结果如下:
- 常量E的值为:2.718281828459045
- 常量PI的值为:3.141592653589793
1.2.求最大值、最小值和绝对值
在程序中常见的就是求最大值、最小值和绝对值问题,如果使用 Math 类提供的方法很便捷,如下:
方法 | 含义 |
static int abs(int a) | 返回 a 的绝对值 |
static long abs(long a) | 返回 a 的绝对值 |
static float abs(float a) | 返回 a 的绝对值 |
static double abs(double a) | 返回 a 的绝对值 |
static int max(int x,int y) | 返回 x 和 y 中的最大值 |
static double max(double x,double y) | 返回 x 和 y 中的最大值 |
static long max(long x,long y) | 返回 x 和 y 中的最大值 |
static float max(float x,float y) | 返回 x 和 y 中的最大值 |
static int min(int x,int y) | 返回 x 和 y 中的最小值 |
static long min(long x,long y) | 返回 x 和 y 中的最小值 |
static double min(double x,double y) | 返回 x 和 y 中的最小值 |
static float min(float x,float y) | 返回 x 和 y 中的最小值 |
案例:求 5 和 120 的较大值、3.14 和 2.12 的较小值、-2 的绝对值,代码如下:
public class Test01 {
public static void main(String[] args) {
System.out.println("求 5 和 120 的较大值:"+Math.max(2,120));
System.out.println("求 3.14 和 2.12 的较小值:"+Math.min(3.14,2.12));
System.out.println("求 -2 的绝对值:"+Math.abs(-2));
}
}
代码执行后,结果如下:
- 求 5 和 120 的较大值:120
- 求 3.14 和 2.12 的较小值:2.12
- 求 -2 的绝对值:2
1.3.求整运算
Math 类的求整方法有很多
方法 | 说明 |
static double ceil(double a) | 返回大于或等于 a 的最小整数 |
static double floor(double a) | 返回小于或等于 a 的最大整数 |
static double rint(double a) | 返回最接近 a 的整数值,如果有两个同样接近的整数,则结果取偶数 |
static int round(float a) | 将参数加上 1/2 后返回与参数最近的整数 |
static long round(double a) | 将参数加上 1/2 后返回与参数最近的整数,然后强制转换为长整型 |
Math 类中取整函数方法的应用:
public class Test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入数字:");
double num = scanner.nextDouble();
System.out.println("大于或者等于"+num+"的最小整数:"+Math.ceil(num));
System.out.println("小于或者等于"+num+"的最大整数:"+Math.floor(num));
System.out.println("将"+num+"加上0.5之后最接近的整数"+Math.round(num));
System.out.println("将"+num+"的整数"+Math.rint(num));
}
}
代码执行如下:
- 大于或者等于3.1415926的最小整数:4.0
- 小于或者等于3.1415926的最大整数:3.0
- 将3.1415926加上0.5之后最接近的整数3
- 将3.1415926的整数3.0
1.4.三角函数运算
Math 类中包含的三角函数方法及其说明如下:
方法 | 说明 |
static double sin(double a) | 返回角的三角正弦值,参数以孤度为单位 |
static double cos(double a) | 返回角的三角余弦值,参数以孤度为单位 |
static double asin(double a) | 返回一个值的反正弦值,参数域在 [-1,1],值域在 [-PI/2,PI/2] |
static double acos(double a) | 返回一个值的反余弦值,参数域在 [-1,1],值域在 [0.0,PI] |
static double tan(double a) | 返回角的三角正切值,参数以弧度为单位 |
static double atan(double a) | 返回一个值的反正切值,值域在 [-PI/2,PI/2] |
static double toDegrees(double angrad) | 将用孤度表示的角转换为近似相等的用角度表示的角 |
staticdouble toRadians(double angdeg) | 将用角度表示的角转换为近似相等的用弧度表示的角 |
上面每个方法的参数和返回值都是 double 类型,参数以弧度代替角度来实现,其中 1 度等于 π/180 弧度,因此平角就是 π 弧度。
public class Test01 {
public static void main(String[] args) {
System.out.println("90度的正弦值:"+Math.sin(Math.PI/2));
System.out.println("0度的余弦值:"+Math.cos(0));
System.out.println("1的反正切值:"+Math.atan(1));
System.out.println("120度的弧度值:"+Math.toRadians(120.0));
}
}
代码执行结果如:
- 90度的正弦值:1.0
- 0度的余弦值:1.0
- 1的反正切值:0.7853981633974483
- 120度的弧度值:2.0943951023931953
1.5.指数运算
指数的运算包括求方根、取对数及其求 n 次方的运算。在 Math 类中定义的指数运算方法及其说明如下:
方法 | 说明 |
static double exp(double a) | 返回 e 的 a 次幂 |
static double pow(double a,double b) | 返回以 a 为底数,以 b 为指数的幂值 |
static double sqrt(double a) | 返回 a 的平方根 |
static double cbrt(double a) | 返回 a 的立方根 |
static double log(double a) | 返回 a 的自然对数,即 lna 的值 |
static double log10(double a) | 返回以 10 为底 a 的对数 |
使用 Math 类中的方法实现指数的运算,main() 方法中的代码如下:
public class Test01 {
public static void main(String[] args) {
System.out.println("4的立方值:"+Math.pow(4,3));
System.out.println("16的平方根:"+Math.sqrt(16));
System.out.println("10的底2的对数:"+Math.log10(2));
}
}
代码执行如下:
- 4的立方值:64.0
- 16的平方根:4.0
- 10的底2的对数:0.3010299956639812
二、java生成随机数(random()和Random类)
在 Java 中要生成一个指定范围之内的随机数字有两种方法:一种是调用 Math 类的 random() 方法,一种是使用 Random 类。
Random 类提供了丰富的随机数生成方法,可以产生 boolean、int、long、float、byte 数组以及 double 类型的随机数,这是它与 random() 方法最大的不同之处。random() 方法只能产生 double 类型的 0~1 的随机数。
Random 类位于 java.util 包中,该类常用的有如下两个构造方法。
- Random():这个构造方法使用一个和当前系统时间对应的数字作为种子数,然后使用这个种子数构造 Random 对象。
- Random(long seed):使用单个 long 类型的参数创建一个新的随机数生成器。
Random 类提供的所有方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的概率是均等的,
方法 | 说明 |
boolean nextBoolean() | 生成一个随机的 boolean 值,生成 true 和 false 的值概率相等 |
double nextDouble() | 生成一个随机的 double 值,数值介于 [0,1.0),含 0 而不包含 1.0 |
int nextlnt() | 生成一个随机的 int 值,该值介于 int 的区间,也就是 -231~231-1。如果 需要生成指定区间的 int 值,则需要进行一定的数学变换 |
int nextlnt(int n) | 生成一个随机的 int 值,该值介于 [0,n),包含 0 而不包含 n。如果想生成 指定区间的 int 值,也需要进行一定的数学变换 |
void setSeed(long seed) | 重新设置 Random 对象中的种子数。设置完种子数以后的 Random 对象 和相同种子数使用 new 关键字创建出的 Random 对象相同 |
long nextLong() | 返回一个随机长整型数字 |
boolean nextBoolean() | 返回一个随机布尔型值 |
float nextFloat() | 返回一个随机浮点型数字 |
double nextDouble() | 返回一个随机双精度值 |
案例如下:
public class Test02 {
public static void main(String[] args) {
Random random = new Random();
double d1 = random.nextDouble();//生成区间[0,1.0]内的小数
double d2 = random.nextDouble() * 7; //生成区间[0,7.0]内的小数
int i1 = random.nextInt(10);//生成[0,10]区间的整数
int i2 = random.nextInt(18)-3;//生成[-3,15]区间的整数
long l1 = random.nextLong();//生成一个随机长整型值
boolean b1 = random.nextBoolean();//生成一个随机布尔值
float f1 = random.nextFloat();//生成一个随机浮点型值
System.out.println("生成的[0,1.0]区间的小数是:" + d1);
System.out.println("生成的[0,7.0]区间的小数是:" + d2);
System.out.println("生成的[0,10]区间的整数是:" + i1);
System.out.println("生成的[-3,15]区间的整数是:" + i2);
System.out.println("生成一个随机长整型值:" + l1);
System.out.println("生成一个随机布尔型值:" + b1);
System.out.println("生成一个随机浮点型值:" + f1);
}
}
代码执行后结果如下:
- 生成的[0,1.0]区间的小数是:0.3615695314305458
- 生成的[0,7.0]区间的小数是:4.019759738132422
- 生成的[0,10]区间的整数是:4
- 生成的[-3,15]区间的整数是:10
- 生成一个随机长整型值:-3205734793834935172
- 生成一个随机布尔型值:true
- 生成一个随机浮点型值:0.09433818
三、Java数字格式化
数字的格式在解决实际问题时使用非常普遍,这时可以使用 DedmalFormat 类对结果进行格式化处理。例如,将小数位统一成 2 位,不足 2 位的以 0 补齐。
DecimalFormat 是 NumberFormat 的一个子类,用于格式化十进制数字。DecimalFormat 类包含一个模式和一组符号,常用符号的说明如下:
符号 | 说明 |
0 | 显示数字,如果位数不够则补 0 |
# | 显示数字,如果位数不够不发生变化 |
. | 小数分隔符 |
- | 减号 |
, | 组分隔符 |
E | 分隔科学记数法中的尾数和小数 |
% | 前缀或后缀,乘以 100 后作为百分比显示 |
? | 乘以 1000 后作为千进制货币符显示。用货币符号代替。如果双写,用国际货币符号代替; 如果出现在一个模式中,用货币十进制分隔符代替十进制分隔符 |
DecimalFormat 类将数字转换成各种格式,案例如下:
public class Test03 {
public static void main(String[] args) {
//实例化DecimalFormat类的对象,指定格式
DecimalFormat df1 = new DecimalFormat("0.0");
DecimalFormat df2 = new DecimalFormat("#.#");
DecimalFormat df3 = new DecimalFormat("000.000");
DecimalFormat df4 = new DecimalFormat("###.###");
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个float类型的数字:");
float f = scanner.nextFloat();
//对输入的数字使用格式
System.out.println("0.0 格式:"+df1.format(f));
System.out.println("#.# 格式:"+df2.format(f));
System.out.println("000.000 格式:"+df3.format(f));
System.out.println("###.### 格式:"+df4.format(f));
}
}
代码执行结果如下:
四、Java时间日期的处理:Java Date类、Calendar类
在 Java 中获取当前时间,可以使用 java.util.Date 类和 java.util.Calendar
4.1.Date 类
Date 类表示系统特定的时间戳,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。
4.1.1. 构造方法
Date 类有如下两个构造方法。
- Date():此种形式表示分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间。
- Date(long date):此种形式表示从 GMT 时间(格林尼治时间)1970 年 1 月 1 日 0 时 0 分 0 秒开始经过参数 date 指定的毫秒数。
这两个构造方法的使用示例如下:
public class Test04 {
public static void main(String[] args) {
Date d1 = new Date();//调用无参构造器
System.out.println(d1);//Wed May 31 14:36:45 CST 2023
Date d2 = new Date(60000);//调用含有一个龙类型参数的有参构造器
System.out.println(d2); //输出Thu Jan 01 08:01:00 CST 1970
}
}
注意:
- Date 类的无参数构造方法获取的是系统当前的时间,显示的顺序为星期、月、日、小时、分、秒、年。
- Date 类带 long 类型参数的构造方法获取的是距离 GMT 指定毫秒数的时间,60000 毫秒是一分钟,而 GMT(格林尼治标准时间)与 CST(中央标准时间)相差 8 小时,也就是说 1970 年 1 月 1 日 00:00:00 GMT 与 1970 年 1 月 1 日 08:00:00 CST 表示的是同一时间。 因此距离 1970 年 1 月 1 日 00:00:00 CST 一分钟的时间为 1970 年 1 月 1 日 00:01:00 CST,即使用 Date 对象表示为 Thu Jan 01 08:01:00 CST 1970。
4.1.2. 常用方法
Date 类提供了许多与日期和事件相关的方法,如下:
方法 | 描述 |
boolean after(Date when) | 判断此日期是否在指定日期之后 |
boolean before(Date when) | 判断此日期是否在指定日期之前 |
int compareTo(Date anotherDate) | 比较两个日期的顺序 |
boolean equals(Object obj) | 比较两个日期的相等性 |
long getTime() | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来,此 Date 对象表示的毫秒数 |
String toString() | 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy。 其中 dow 是一周中的某一天(Sun、Mon、Tue、Wed、Thu、Fri 及 Sat) |
案例代码如下:
public class Test04 {
public static void main(String[] args) {
Date date = new Date();
long time = date.getTime();
System.out.println("返回自 1970 年 1 月 1 日 00:00:00 GMT 以来到现在度过的秒数:"+time);
Date d1 = new Date(2018, 11, 12);
Date d2 = new Date(2015, 12, 12);
boolean after = d1.after(d2);
System.out.println("判断d1是否在d2指定日期之后:"+after);//true
boolean before = d1.before(d2);
System.out.println("判断d1是否在d2指定日期之前:"+before);//false
int i = d1.compareTo(d2);
System.out.println("比较d1和d2两个日期的顺序:"+i);//返回1或者-1,这里返回-1
boolean equals = d1.equals(d2);
System.out.println("比较d1和d2两个日期的是否相等:"+equals);
}
}
执行后结果如下:
- 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来到现在度过的秒数:1685517952883
- 判断d1是否在d2指定日期之后:true
- 判断d1是否在d2指定日期之前:false
- 比较d1和d2两个日期的顺序:1
- 比较d1和d2两个日期的是否相等:false
4.2.Calendar 类
Calendar 类是一个抽象类,它为特定瞬间与 YEAR、MONTH、DAY_OF—MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期) 提供了一些方法。
创建 Calendar 对象不能使用 new 关键字,因为 Calendar 类是一个抽象类,但是它提供了一个 getInstance() 方法来获得 Calendar类的对象。getInstance() 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。
Calendar calendar = Calendar.getInstance();
当创建了一个 Calendar 对象后,就可以通过 Calendar 对象中的一些方法来处理日期、时间。Calendar 类的常用方法如表 2 所示。
方法 | 描述 |
void add(int field, int amount) | 根据日历的规则,为给定的日历字段 field 添加或减去指定的时间量 amount |
boolean after(Object when) | 判断此 Calendar 表示的时间是否在指定时间 when 之后,并返回判断结果 |
boolean before(Object when) | 判断此 Calendar 表示的时间是否在指定时间 when 之前,并返回判断结果 |
void clear() | 清空 Calendar 中的日期时间值 |
int compareTo(Calendar anotherCalendar) | 比较两个 Calendar 对象表示的时间值(从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量),大则返回 1,小则返回 -1,相等返回 0 |
int get(int field) | 返回指定日历字段的值 |
int getActualMaximum(int field) | 返回指定日历字段可能拥有的最大值 |
int getActualMinimum(int field) | 返回指定日历字段可能拥有的最小值 |
int getFirstDayOfWeek() | 获取一星期的第一天。根据不同的国家地区,返回不同的值 |
static Calendar getInstance() | 使用默认时区和语言坏境获得一个日历 |
static Calendar getInstance(TimeZone zone) | 使用指定时区和默认语言环境获得一个日历 |
static Calendar getInstance(TimeZone zone, Locale aLocale) | 使用指定时区和语言环境获得一个日历 |
Date getTime() | 返回一个表示此 Calendar 时间值(从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量)的 Date 对象 |
long getTimeInMillis() | 返回此 Calendar 的时间值,以毫秒为单位 |
void set(int field, int value) | 为指定的日历字段设置给定值 |
void set(int year, int month, int date) | 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 |
void set(int year, int month, int date, int hourOfDay, int minute, int second) | 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、 MINUTE 和 SECOND 的值 |
void setFirstDayOfWeek(int value) | 设置一星期的第一天是哪一天 |
void setTimeInMillis(long millis) | 用给定的 long 值设置此 Calendar 的当前时间值 |
Calendar 对象可以调用 set() 方法将日历翻到任何一个时间,当参数 year 取负数时表示公元前。Calendar 对象调用 get() 方法可以获取有关年、月、日等时间信息,参数 field 的有效值由 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:星期几。
例如,获取当前年、月、日可用如下代码:
public class Test05 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
//获取年份
System.out.println(calendar.get(Calendar.YEAR));
//获取月份
System.out.println(calendar.get(Calendar.MONTH));
//获取日期
System.out.println(calendar.get(Calendar.DATE));
}
}
如果整型变量 month 的值是 0,表示当前日历是在 1 月份;如果值是 11,则表示当前日历在 12 月份。
使用 Calendar 类处理日期时间的实例如下:
public class Test05 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());//将当前系统时间赋值给Calendar对象
System.out.println("现在时间:"+calendar.getTime());//获取当前时间
int year = calendar.get(calendar.YEAR);//获取年份
System.out.println("年份是:"+year);
int month = calendar.get(calendar.MONTH);//获取月份
System.out.println("月份是:"+month);
int data = calendar.get(calendar.DATE);//获取日
System.out.println("日是:"+data);
int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;//获取今天星期几(星期日为第一天)
System.out.println(week);
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取当前小时数(24 小时制)
System.out.print(hour + "时");
int minute = calendar.get(Calendar.MINUTE); // 获取当前分钟
System.out.print(minute + "分");
int second = calendar.get(Calendar.SECOND); // 获取当前秒数
System.out.print(second + "秒");
int millisecond = calendar.get(Calendar.MILLISECOND); // 获取毫秒数
System.out.print(millisecond + "毫秒");
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 获取今天是本月第几天
System.out.println("今天是本月的第 " + dayOfMonth + " 天");
int dayOfWeekInMonth = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH); // 获取今天是本月第几周
System.out.println("今天是本月第 " + dayOfWeekInMonth + " 周");
int many = calendar.get(Calendar.DAY_OF_YEAR); // 获取今天是今年第几天
System.out.println("今天是今年第 " + many + " 天");
Calendar c = Calendar.getInstance();
c.set(2022, 8, 8); // 设置年月日,时分秒将默认采用当前值
System.out.println("设置日期为 2022-8-8 后的时间:" + c.getTime()); // 输出时间
}
}
五、Java日期格式化(DateFormat类和SimpleDateFormat类)
格式化日期表示将日期/时间格式转换为预先定义的日期/时间格式。例如将日期“Fri May 18 15:46:24 CST2018” 格式转换为 “2018-5-18 15:46:24 星期五”的格式。
在 Java 中,可以使用 DateFormat 类和 SimpleDateFormat 类来格式化日期,下面详细介绍这两个格式化日期类的使用。
5.1.DateFormat 类
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期→文本)、解析(文本→日期)和标准化日期。
在创建 DateFormat 对象时不能使用 new 关键字,而应该使用 DateFormat 类中的静态方法 getDateInstance(),示例代码如下:
DateFormat df = DateFormat.getDatelnstance();
在创建一个 DateFormat 对象后,可以调用该对象中的方法来对日期/时间进行格式化。DateFormat 类中常用方法如下:
方法 | 描述 |
String format(Date date) | 将 Date 格式化日期/时间字符串 |
Calendar getCalendar() | 获取与此日期/时间格式相关联的日历 |
static DateFormat getDateInstance() | 获取具有默认格式化风格和默认语言环境的日期格式 |
static DateFormat getDateInstance(int style) | 获取具有指定格式化风格和默认语言环境的日期格式 |
static DateFormat getDateInstance(int style, Locale locale) | 获取具有指定格式化风格和指定语言环境的日期格式 |
static DateFormat getDateTimeInstance() | 获取具有默认格式化风格和默认语言环境的日期/时间 格式 |
static DateFormat getDateTimeInstance(int dateStyle,int timeStyle) | 获取具有指定日期/时间格式化风格和默认语言环境的 日期/时间格式 |
static DateFormat getDateTimeInstance(int dateStyle,int timeStyle,Locale locale) | 获取具有指定日期/时间格式化风格和指定语言环境的 日期/时间格式 |
static DateFormat getTimeInstance() | 获取具有默认格式化风格和默认语言环境的时间格式 |
static DateFormat getTimeInstance(int style) | 获取具有指定格式化风格和默认语言环境的时间格式 |
static DateFormat getTimeInstance(int style, Locale locale) | 获取具有指定格式化风格和指定语言环境的时间格式 |
void setCalendar(Calendar newCalendar) | 为此格式设置日历 |
Date parse(String source) | 将给定的字符串解析成日期/时间 |
格式化样式主要通过 DateFormat 常量设置。将不同的常量传入到表 1 所示的方法中,以控制结果的长度。DateFormat 类的常量如下。
- SHORT:完全为数字,如 12.5.10 或 5:30pm。
- MEDIUM:较长,如 May 10,2016。
- LONG:更长,如 May 12,2019 或 11:15:32am。
- FULL:是完全指定,如 Tuesday、May 10、2018 AD 或 11:l5:42am CST。
public class Test06 {
public static void main(String[] args) {
//获取不同格式化风格和中国的时间日期
DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, Locale.CHINA);
DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINA);
DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
//将不同格式化风格的时间格式化为时间字符串
String format1 = df1.format(new Date());
String format2 = df2.format(new Date());
String format3 = df3.format(new Date());
String format4 = df4.format(new Date());
//输出日期
System.out.println("SHORT:"+format1); //23-5-31
System.out.println("MEDIUM:"+format2);//2023-5-31
System.out.println("LONG:"+format3);//2023年5月31日
System.out.println("FULL:"+format4);//2023年5月31日 星期三
}
}
输出结果如下:
- SHORT:23-5-31
- MEDIUM:2023-5-31
- LONG:2023年5月31日
- FULL:2023年5月31日 星期三
5.2.SimpleDateFormat 类
如果使用 DateFormat 类格式化日期/时间并不能满足要求,那么就需要使用 DateFormat 类的子类——SimpleDateFormat。
SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类,它允许进行格式化(日期→文本)、解析(文本→日期)和规范化。SimpleDateFormat 使得可以选择任何用户定义的日期/时间格式的模式。
SimpleDateFormat 类主要有如下 3 种构造方法。
- SimpleDateFormat():用默认的格式和默认的语言环境构造 SimpleDateFormat。
- SimpleDateFormat(String pattern):用指定的格式和默认的语言环境构造 SimpleDateF ormat。
- SimpleDateFormat(String pattern,Locale locale):用指定的格式和指定的语言环境构造 SimpleDateF ormat。
SimpleDateFormat 自定义格式中常用的字母及含义如下:
字母 | 含义 | 示例 |
y | 年份。一般用 yy 表示两位年份,yyyy 表示 4 位年份 | 使用 yy 表示的年扮,如 11; 使用 yyyy 表示的年份,如 2011 |
M | 月份。一般用 MM 表示月份,如果使用 MMM,则会 根据语言环境显示不同语言的月份 | 使用 MM 表示的月份,如 05; 使用 MMM 表示月份,在 Locale.CHINA 语言环境下,如“十月”;在 Locale.US 语言环境下,如 Oct |
d | 月份中的天数。一般用 dd 表示天数 | 使用 dd 表示的天数,如 10 |
D | 年份中的天数。表示当天是当年的第几天, 用 D 表示 | 使用 D 表示的年份中的天数,如 295 |
E | 星期几。用 E 表示,会根据语言环境的不同, 显示不 同语言的星期几 | 使用 E 表示星期几,在 Locale.CHINA 语 言环境下,如“星期四”;在 Locale.US 语 言环境下,如 Thu |
H | 一天中的小时数(0~23)。一般用 HH 表示小时数 | 使用 HH 表示的小时数,如 18 |
h | 一天中的小时数(1~12)。一般使用 hh 表示小时数 | 使用 hh 表示的小时数,如 10 (注意 10 有 可能是 10 点,也可能是 22 点) |
m | 分钟数。一般使用 mm 表示分钟数 | 使用 mm 表示的分钟数,如 29 |
s | 秒数。一般使用 ss 表示秒数 | 使用 ss 表示的秒数,如 38 |
S | 毫秒数。一般使用 SSS 表示毫秒数 | 使用 SSS 表示的毫秒数,如 156 |
案例如下:
public class Test07 {
public static void main(String[] args) {
Date date = new Date();//创建一个Date对象,获取当前时间
//指定格式。然后进行格式化处理
SimpleDateFormat f = new SimpleDateFormat("今天是"+"yyyy 年 MM 月 dd 日 HH点 mm 分 ss 秒");
System.out.println(f.format(date));
}
}