时间在Java中是两个类 Date 和 Calendar
Date类
Date是在Java.util包中的也就是工具包。
测试
输出的是当前的系统时间
修改idea中的注释的颜色:
是date不是data
package org.data;
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date d = new Date();//系统时间
System.out.println(d);
System.out.println(d.getYear()); //从1900年开始算的
System.out.println(d.getMonth()); //月份从0 开始
System.out.println(d.getDate()); //日期
System.out.println(d.getHours()); //小时
System.out.println(d.getMinutes());//分钟
System.out.println(d.getSeconds());//秒
System.out.println(d.getTime()); //得到的是一个时间戳
}
}
最后那个时间戳就可以用来计算时间差什么的
这里可以看出Date的不方便就是从年份来看的,不方便。
calendar类
下面来看看calendar类
public abstract class Calendar
extends
implements [Serializable]
官网说了,这东西是个抽象类,抽象类不能实例化。
官方原话:
Calendar 类是一个抽象类,它提供了在特定的时间瞬间和一组日历字段(如 YEAR、 MONTH、 DAY _ OF _ MONTH、 HOUR 等)之间进行转换的方法,还提供了操作日历字段(如获取下周的日期)的方法。时间上的瞬间可以用一个毫秒值来表示,这个值与1970年1月1日格林威治时间00.00.00.000(格里高利时间)的纪元相比是一个偏移量。
接着官方就告诉你如何在不实例化类的情况下使用这个类:
该类还提供了用于在包外实现具体日历系统的其他字段和方法。这些字段和方法被定义为 protected。
与其他区域设置敏感的类一样,Calendar 提供了一个类方法 getInstance,用于获取这种类型的通用对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,该对象的日历字段已用当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();
看看输出的东西:
java.util.GregorianCalendar[time=1673008486382,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2023,MONTH=0,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=6,DAY_OF_YEAR=6,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=34,SECOND=46,MILLISECOND=382,ZONE_OFFSET=28800000,DST_OFFSET=0]
其实可以发现,这其中包含了年月日时分秒的很多信息。
package org.data;
import java.util.Calendar;
import java.util.Date;
public class testcalendar {
public static void main(String[] args) {
Calendar instance = Calendar.getInstance();
System.out.println(instance);
System.out.println(instance.get(Calendar.YEAR));
System.out.println(instance.get(Calendar.MONTH) + 1);
System.out.println(instance.get(Calendar.DATE));
System.out.println(instance.get(Calendar.HOUR_OF_DAY));
System.out.println(instance.get(Calendar.MINUTE));
System.out.println(instance.get(Calendar.SECOND));
System.out.println("---------------------------------------");
instance.set(Calendar.DATE,instance.get(Calendar.DATE)+30);//将时间往前30天
System.out.println(instance.get(Calendar.YEAR));
System.out.println(instance.get(Calendar.MONTH) + 1);
System.out.println(instance.get(Calendar.DATE));
System.out.println(instance.get(Calendar.HOUR_OF_DAY));
System.out.println(instance.get(Calendar.MINUTE));
System.out.println(instance.get(Calendar.SECOND));
// 我虽然是直接加了30天,但是如果月份进位了,他会自动进位。就很方便。
// Calendar中获取完整的时间
Date d = instance.getTime();
System.out.println(d);
// date转换成calendar
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
}
}
可以自己code试试。这里对于日期的加或者减都是可以的。
格式化时间:
SimpleDateFormat:格式化时间的工具类。
在java.text包中
字符串转换成时间:format(Date)
package org.data;
import com.sun.xml.internal.ws.util.xml.CDATA;
import java.text.SimpleDateFormat;
import java.util.Date;
public class testTime {
// 格式化时间:
public static void main(String[] args) {
Date date = new Date();
// 默认的时间效果:
System.out.println(date );
// 格式化之后:
// 设置格式化的类型
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss");
// 格式化日期
String dates = simpleDateFormat.format(date);
System.out.println(dates);
}
}
时间转换成字符串:
package org.data;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class testTime2 {
public static void main(String[] args) throws ParseException {
Scanner scanner = new Scanner(System.in);
System.out.println("输入一个时间");
String s = scanner.nextLine();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = simpleDateFormat.parse(s);
System.out.println(d);
}
}
时间差的计算:
package org.data;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class testTime2Time {
public static void main(String[] args) throws ParseException {
String S1 = "2018-09-08 12:00:00";
String S2 = "2018-09-09 12:00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = sdf.parse(S1);
Date d2 = sdf.parse(S2);
// 变成时间戳之后再相减。
long d3 = Math.abs(d2.getTime() - d1.getTime());
// 把时间戳变回来。
long diffSec = d3/1000; //秒级别的
// 除以1000是毫秒变秒,就是个进制转换。
// 分钟
long diffMin = diffSec/60;
// 显示成小时加分钟:
long diffHour = diffMin/60;
long diffMin1 = diffMin%60;
// 天数:
int days = (int) ((d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24));
System.out.println(days);
}
}
依次类推就可以计算所有的时间差了