Date日期类
表示瞬时的时间,就是时间的偏移量
几个通用的时间
- CST: 中国标准时间
- UTC: 协调世界时
- GMT: 世界时(格林威治时间)
java中时间的起点:1970-1-1 0:0:0:000
常用的方法:
- 获取当前的时间
Date date = new Date();
- 获取当前时间的偏移量(时间起点至今的毫秒值)
long time = date.getTime();
- 通过时间偏移量创建date对象
Date date = new Date(Long.MAX_VALUE);
- 其他方法
date.after(date2); //前者在后者之后返回boolean
date.before(date2); //前者在后者之前返回boolean
date.compare(date2); //返回int 若为正数则前者大,以此类推
Calendar 日历类
- 是一个抽象类,有一个实现类GregorianCalendar
- 通过Calandar.getInstance()获取单例对象
和时间相关的常量
YEAR 年份
MONTH 月份 实际的月份-1
DATE 日期
HOUR 小时
MINUTE 分钟
SECOND 秒
MILLISECOND 毫秒
DAY_OF_WEEK 在一个星期中的周几(日到六 1-7)
DAY_OF_MONTH 在一个月中的日期
常用的方法
- 返回指定日历的字段值
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR));//2019
- 修改指定字段的值
calendar.add(Calendar.YEAR, -1);//2018(-1 表示减去一年)
- 设置指定字段的值
calendar.set(Calendar.YEAR, 2022);//2022
- 日期类和Calendar类之间的相互转化
Date date = calendar.getTime();
Date date2 = new Date();
calendar.setTime(date2);
作业:输入月份年份打印日历:
public class Work01 {
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("请输入年份:");
int year = input.nextInt();
System.out.println("请输入月份:");
int month = input.nextInt();
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, 1);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
calendar.add(Calendar.MONTH, 1);
int nextMonthDayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
int days = nextMonthDayOfYear - dayOfYear;
days = days < 0 ? 31 : days;
// System.out.println(dayOfWeek);
// System.out.println(days);
System.out.println("一\t二\t三\t四\t五\t六\t日");
for (int j = 0; j < (dayOfWeek == 1 ? 6 : dayOfWeek - 2); j++) {
System.out.print("\t");
}
for (int i = 1; i <= days; i++) {
System.out.print(i + "\t");
calendar.set(year, month - 1, i);
if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
System.out.println();
}
}
}
}
DateFormat 日期格式类
是一个抽象类,有子类SimpleDateFormat
使用getInstance()系类方法获取实例,不同的实例化风格不一样
getInstance(): 19-12-11 下午4:09
getDateInstance(): 2019-12-11
getTimeInstance(): 16:09:56
常用的方法:
- 将日期格式化成字符串
Date now = new Date();
DateFormat df1 = DateFormat.getInstance();
String str1 = df1.format(now);
- 将符合格式的字符串解析成日期对象
Date date1 = null;
try{
date1 = df1.parse("19-12-11 ")
} catch(ParseException e){
e.PrintStackTrace();
}
SimpleDateFormat 类
是DateFormat的子类
使用构造方法创建对象:
- 无参构造创建对象和DateFormat.getInstance()获取的实例格式一致
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.format(date);
- 一般使用有参
字符 | 含义 |
---|---|
yyyy | 年 |
MM | 月 |
dd | 日 |
HH | 时 (hh是12小时制度) |
mm | 分 |
ss | 秒 |
SSS | 毫秒 |
常用方法
- format(Date date): 将日期对象格式化成字符串
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.format(now)
- parse(String str): 将符合格式的字符串解析成日期对象
String str = "1999-5-11 12:12:12.123";
Date date = null;
try{
date = sdf.parse(str);
} catch(ParseException e){
e.printStackTrace();
}
jdk 1.8+ 新日期类
LocalDateTime\LocalDate\LocalTime
注意:
- Date和Calendar类都在java.util包下,新日期类在java.timr包下
- 内部有一个私有的无参构造,不能new对象
常用的方法:
- 获取当前的时间 now()
LocalDateTime now = LocalDateTime.now();
- 根据指定日期创建对象 of()
LocalDateTime ldt = LocalDateTime.of(2019, 12, 12, 9, 8 ,8)
- 一系列的getter方法,用于获取日期相关字段值
System.out.println(ldt.getYear());
- 提供了一系列plus方法:用于计算日期,每次计算都会返回一个新的对象,不会修改原来的对象
LocalDateTime newLdt = ldt.plusDays(7);
- 日期对象格式化为字符串
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分ss秒");
String nowStr = now.format(dtf);
String nowStr1. format(now);
DateTimeFormatter 类
- jdk 1.8+
- DateFoamat 和 SimpleDateFormat都在java.text包下,DateTimeFormatter在java.time.format包下
常用方法:
- 根据指定格式化样式创建格式化器对象
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- 格式化日期对象
dtf.format(LocalTimeFormatter.now());
重点:LocalDateTime 和 Date 之间的相互转换
这里需要补充一个类:Instance
- jdk 1.8 +
- 瞬时类、时间戳、时刻类
Date -> LocalDateTime
@Test
public void test(){
Date date = new Date();
Instance instance = date.toInstance();
//选择时区
ZoneId zonId = ZoneId.systemDefault();
LocalDateTime ldt = instance.atZone(zonId).toLocalDateTime();
}
LocalDateTime -> Date
@Test
public void test(){
LocalDateTime ldt = LocalDateTime.now();
ZoneId zoneId = ZoneId.systemDefault();
Instance instance = ldt.atZone(zoneId).toInstance();
Date date = Date.from(instance);
}
实际项目自定义一个日期的工具类:
/**
* 自定义日期工具类
*/
public final class MyDateUtil {
private MyDateUtil() {
}
/**
* Date转LocalDateTime
* @Param date 传入Date对象
* @return LocalDateTime 对象
*/
public static LocalDateTime dateToLocalDateTime(Date date){
return date.toInstance().atZine(ZoneId.systemDefault()).toLocalDateTime();
}
/**
* LocalDateTime转Date
* @Param localDateTime 传入LocalDateTime对象
* @return Date对象
*/
public static Date localDateTimeToData(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* date 转 calendar
* @param date
* @return Calendar对象
*/
public static Calendar dateToCalendar(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
}
/**
* Calendar转date
* @param calendar
* @return Date对象
*/
public static Date calendarToDate(Calendar calendar){
return calendar.getTime();
}
/**
* date增加天数
* @param date
* @return Date对象
*/
public static Date addDays(Date date, int days){
Calendar calendar = dateToCalendar(date);
calendar.add(Calendar.DAY_OF_MONTH, days);
return date;
}
/**
* date增加月份
* @param date
* @return Date对象
*/
public static Date addMonths(Date date, int months){
Calendar calendar = dateToCalendar(date);
calendar.add(Calendar.MONTH, months);
return date;
}
/**
* date增加年数
* @param date
* @return Date对象
*/
public static Date addYears(Date date, int years){
Calendar calendar = dateToCalendar(date);
calendar.add(Calendar.Year, years);
return date;
}
/**
* date增加年月日时分秒
* @param date
* @return Date对象
* @throws Exception
*/
public static Date add(Date date, int... params) throws Exception{
if(params.length > 7 || params.length < 1){
throw new Exception("参数必须是1-7");
}
int[] calendarValues = {
Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH,
Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, Calensdar.MILLISECOND
};
Calendar calendar = dateToCalendar(date);
for(int i = 0; i < param.length; i++){
calendar.add(calendarValue[i], params[i]);
}
return calendarToDate(calendar);
}
}