SimpleDateFormat类
- SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类
- 进行格式化(日期—>文本)、解析(文本—>日期)
- 常用的时间模式字母(在创建对象时可能会用到)
字母 | 日期或时间 | 示例 |
---|---|---|
y | 年 | 2019 |
m | 年中月份 | 08 |
d | 月中天数 | 10 |
h | 1天中小时数(0~23) | 22 |
m | 分钟 | 16 |
s | 秒 | 59 |
S | 毫秒 | 367 |
- 实例
想要输出时间,那我们首先要创建一个SimpleDateFormat对象
public class Demo01 {
public static void main(String[] args) {
//1.创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");//括号中表示你想将时间以什么样的方式输出
}
}
然后创建一个Date对象
//2.创建Date
Date date = new Date();
可能有人对为什么创建两个对象不是很懂。我们首先要明确的是Date类中的对象是来获取时间的,但是,仅仅获取了时间还是不够的,你可以用很多的方式来表达,比如你可以输出“8月10日9:43:11”也可以输出“8月10号9点43过11秒”……创建SimpleDateFormat对象的作用便是用来格式化Date,给他一个既定的格式
//格式化Date
String s = sdf.format(date);
输出
System.out.println(s);
结果为
2021年08月10日09:47:55
若是想改变输出格式,就去改变SimpleDateFormat对象即可,如:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
那么此时的输出结果就会变为
2021/08/10 09:47:55
格式化date是把日期转成字符串,那么同样也可以把字符串转成日期,这个过程叫做解析
//解析:把字符串转为时间
Date date1=sdf.parse("2001年02月06日13:50:20");
System.out.println(date1);
输出的结果为
Tue Feb 06 13:50:20 CST 2001
这里输出的即是date获取的时间的默认格式
完整代码如下:
package com.commonClass.simpleDateFormatclass;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo01 {
public static void main(String[] args) throws Exception {
//1.创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");//括号中表示你想将时间以什么样的方式输出
//2.创建Date
Date date = new Date();
//格式化Date把时间转为字符串
String s = sdf.format(date);
System.out.println(s);
//解析:把字符串转为时间
Date date1=sdf.parse("2001年02月06日13:50:20");
System.out.println(date1);
}
}
输出结果为
2021年08月10日10:47:27
Tue Feb 06 13:50:20 CST 2001
System类
- System系统类,主要用于获取系统的属性数据和其他操作,构造方法是私有的,所以在用的时候不用创建对象。其中的方法与属性也都是静态的
方法名 | 说明 |
---|---|
static void arraycopy(……) | 复制数组 |
static long currentTimeMillis(); | 获取当前系统时间,返回的是毫秒值 |
static void gc(); | 建议JVM赶快启动垃圾回收器回收垃圾 |
static void exit(int status); | 退出jvm,如果参数是0表示正常退出jvm,非0表示异常退出jvm |
- 复制数组
public class Demo01 {
public static void main(String[] args) {
//arraycopy
// .arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
// .arraycopy(源数组,从哪个位置开始复制,目标数组,从目标数组的哪个位置开始粘贴,复制的长度);
int[]arr={20,18,15,8,35,26,45,90};
int[]dest=new int[8];
System.arraycopy(arr,0,dest,0,arr.length);
for (int i:dest){
System.out.println(i);
}
}
}
以上是把一个长度为8的数组复制到另一个长度为8的数组当中,其输出结果为
20
18
15
8
35
26
45
90
可以看到数组被完整地复制了过来,我们还可以改变参数值,来达到一些操作目的
public class Demo01 {
public static void main(String[] args) {
//arraycopy
// .arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
// .arraycopy(源数组,从哪个位置开始复制,目标数组,从目标数组的哪个位置开始粘贴,复制的长度);
int[]arr={20,18,15,8,35,26,45,90};
int[]dest=new int[8];
System.arraycopy(arr,2,dest,4,arr.length-5);//复制的长度同样可以是纯数字
for (int i:dest){
System.out.println(i);
}
}
}
此段代码中,原数组会从2开始复制(第三个元素),复制的长度是数组长度-5(即3),目标数组会从4开始粘贴(第五个元素),输出结果为
0
0
0
0
15
8
35
0
需要注意的是,不论是复制还是粘贴,一定要看好数组的上限,否则会造成数组越界而报错
- 垃圾回收
//System.gc()
Student s1=new Student("更生",19);
Student s2=new Student("曹和宇",20);
Student s3=new Student("甦",21);
System.gc();//告诉垃圾回收器回收
package com.commonClass.systemClass;
public class Student {
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
protected void finalize() throws Throwable {
System.out.println("回收了"+name+" "+age);
}
}
如果就按这样运行,会发现没有输出任何东西,说明并没有被回收,其原因是三个对象还在被使用着,如果我们稍微修改一下:
//System.gc()
new Student("更生",19);
new Student("曹和宇",20);
new Student("甦",21);
System.gc();//告诉垃圾回收器回收
此时的输出结果为
回收了更生 19
回收了甦 21
回收了曹和宇 20
说明对象已被回收器回收