全世界的时间,有一个统一的计算标准:
刚开始是格林尼治(格林威治)时间(Greenwich Mean Time)简称GMT,计算核心:地球自转一圈为一天,太阳直射时为正午十二点,但是根据历史记载,曾有过16分钟的大误差,使用时长长达将近130年
到了2012年1月的时候改为原子钟,原子钟利用铯原子的震动频率计算出来的时间,作为世界标准时间(UTC),铯原子每震动9192631770次=1秒(不用记忆,了解一下就行)
中国标准时间=世界标准时间+8小时
1.Data --- 时间类
是一个jdk写好的javaBean类,用来描述时间,精确到毫秒
利用空参构造的对象,默认表示系统当前时间
利用有参构造创建的对象,表示指定的时间
常用方法:
1.pubic Date() --- 创建Data对象,表示当前时间
2.public Date(long date) --- 创建Data对象,表示指定时间
3.public void setTime(long time) --- 设置/修改毫秒值
4.public void getTime --- 获取时间对象的毫秒值
public static void main(String[] args) {
//需求1:打印时间原点开始一年之后的时间
extracted();
//需求2:定义任意两个Date对象,比较一下哪个时间在前,哪个时间在后
extracted1();
}
private static void extracted1() {
//需求2
Random random = new Random();
//1.创建两个data对象
Date d1 = new Date(Math.abs(random.nextInt()));
Date d2 = new Date(Math.abs(random.nextInt()));
//2.获取两个对象之后才能比较,date对象不能比较
long time1 = d1.getTime();
long time2 = d2.getTime();
//3.比较
if(time1>time2){
System.out.println("time1在后,time2在前");
}else if(time1<time2){
System.out.println("time1在前,time2在后");
}else {
System.out.println("time1和time2时间相同");
}
}
private static void extracted() {
//需求1
//1.创建一个对象,表示时间原点
Date d1 = new Date(0L);
//2.获取d1的毫秒值
long time = d1.getTime();
//3.加上一年的毫秒值
time = time +1000L * 60 * 60 * 24 * 365;
//4.把计算结果放回d1中
d1.setTime(time);
//5.打印
System.out.println(d1);
}
2.SimpleDateFormat --- 格式化时间
Data类只能创建默认的时间格式
SimpleDateFormat类的作用:
1.格式化:把时间格式改变
2.解析:把字符串表示的时间变成Data对象
构造方法:
1.public SimpleDateFormat() --- 构造一个SimpleDateFormat,使用默认格式
2.public SimpleDateFormat(String Pattern) --- 构造一个SimpleDateFormat,使用指定格式
常用方法:
1.public final String format(Date date) --- 格式化(日期对象-->字符串)
2.public Date parse(String source) --- 解析(字符串-->日期对象)
接下来分别解释两个方法
(1)格式化
格式化的时间形式的常用模式对应关系:
y --- 年
M --- 月
d --- 日
H --- 时(0-23)
m --- 分
s --- 秒
(如果需要更为详细的格式,直接在API文档中搜索此类就行,这里不再过多赘述)
下面时代码演示
public static void main(String[] args) {
Default();
Point();
}
private static void Point() {
//利用有参构造创建SimpleDateFormat()对象,指定格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E");
Date d = new Date(0L);
String format = sdf.format(d);
System.out.println(format);
}
private static void Default() {
//利用空参构造创建SimpleDateFormat()对象,默认格式
SimpleDateFormat sdf = new SimpleDateFormat();
Date d = new Date(0L);
String format = sdf.format(d);
System.out.println(format);
}
(2)解析
public static void main(String[] args) throws ParseException {
//1.定义一个字符串表示时间
String str = "2023-5-22 11:11:11";
//2.利用空参构造创建SimpleDateFormat对象,创建的代码格式要和字符串的格式一样
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//3.解析传入的字符串为默认时间日期格式
Date date = sdf.parse(str);
System.out.println(date);
//获取这个时间的毫秒值,有了毫秒值就可以进行比较,加减等操作
System.out.println(date.getTime());
}
3.Calendar --- 日历
代表了系统当前时间的日历对象,可以单独修改、获取时间中的年、月、日
细节:它是一个抽象类
获取Calendar日历类对象的方法
public static Calendar getInstance() --- 获取当前时间的日历对象
Calender是一个抽象类,不能直接new,而是通过一个静态方法获取到子类对象
底层原理:
1.会根据系统的不同时区来获取不同的日历对象,默认表示是当前时间
2.把会时间中的纪元:年,月,日,时,分,秒,星期等等的都放到一个数组当中
细节:
1.月份:范围0~11,如果获取出来的是0,那么实际上是1月
2.星期:在老外的眼里,星期日是一周的第一天,1(星期天),2(星期一)
常用方法:
1.public final Date getTime() --- 获取日期对象
2.public final setTime(Date date) --- 给日历设置日期对象
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
//修改日历代表时间
Date d = new Date(0L);
c.setTime(d);
System.out.println(c);
}
3.public long getTimeInMillis() --- 拿到时间毫秒值
4.public void setTimeInMillis(long millis) --- 给日历设置时间毫秒值
和以上操作差不多
5.public int get(int field) --- 取日历中的某个字段信息
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
Date d = new Date(0L);
c.setTime(d);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH)+1;
int date = c.get(Calendar.DATE);
int dateOfWeek = c.get(Calendar.DAY_OF_WEEK);
System.out.println(year+","+month+","+date+","+GetWeek(dateOfWeek));
}
public static String GetWeek(int index){
String[] arr = {"","星期天","星期一","星期二","星期三","星期四","星期五","星期六"};
return arr[index];
}
6.public void set(int field,int value) --- 修改日历的某个字段信息
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
Date d = new Date(0L);
c.setTime(d);
//这里将年份修改成2000年了
c.set(Calendar.YEAR,2000);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH)+1;
int date = c.get(Calendar.DATE);
int dateOfWeek = c.get(Calendar.DAY_OF_WEEK);
System.out.println(year+","+month+","+date+","+GetWeek(dateOfWeek));
}
public static String GetWeek(int index){
String[] arr = {"","星期天","星期一","星期二","星期三","星期四","星期五","星期六"};
return arr[index];
}
7.public void add(int field,int amount) --- 为某个字段增加/减少指定的值
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
Date d = new Date(0L);
c.setTime(d);
//这里将年份修改成2000年了
c.set(Calendar.YEAR,2000);
//这里添加了一个月
c.add(Calendar.MONTH,1);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH)+1;
int date = c.get(Calendar.DATE);
int dateOfWeek = c.get(Calendar.DAY_OF_WEEK);
System.out.println(year+","+month+","+date+","+GetWeek(dateOfWeek));
}
public static String GetWeek(int index){
String[] arr = {"","星期天","星期一","星期二","星期三","星期四","星期五","星期六"};
return arr[index];
}
注:如果添加的月份或者日期超过正常限定范围,那么就会加减一年或者月份