表示时间的类型
java8之前:
java.util.Date
java.sql.Date java.sql.Time java.sql.Timestamp
java.util.Date日期格式为:年月日时分秒
java.sql.Date日期格式为:年月日
java.sql.Time日期格式为:时分秒
java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒)
一般来说java.util.Date 最为常用 也是基础的表示时间的类 继承了三个接口 implements java.io.Serializable, Cloneable, Comparable<Date>
序列化接口 可复制接口 可比较接口
通过查看源码里面有大量不推荐使用的方法,例如获取年月日.. 根据年月日来初始化,但是getTime之类的方法都是推荐使用的
所以我的理解是作者可能希望我们把Date仅当做一个将时间戳转换为java类型的一个类,不具备表示人类语言年月日的概念
主要的构造方法
//获取当前的时间
Date nowDate = new Date();
//获取某个时间戳的时间(到毫秒)
Date nowDate = new Date(1556444260000L);
//根据年月日时分秒是及不推荐的写法
@Deprecated
//根据年月日来获取时间 这里年是从1900年开始算的 然后月份是0-11
Date date = new Date(2019,4,26);
java8新增
java。time包中的是类是不可变且线程安全的(内部变量都是final)。新的时间及日期API位于java.time中,下面是一些关键类
这些类不仅能表示时间 还能计算时间 计算时间一般都可通过时分秒年月日来加减,比如获取两个星期之后的一天之类的,获取时间也非常方便,可以通过方法来获取时分秒年月日 也可以根据参数获取
●Instant——它代表的是时间戳
●LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。
●LocalTime——它代表的是不含日期的时间
●LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。
●ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的
●MonthDay——一个类由月日组合,不包含年信息,可以用来代表每年重复出现的一些日期或其他组合
●DayOfWeek——和monthDay类似
这些类都可以通过gettter方法获取对应的年月日时分秒,以及非常多使用的方法,例如判断今年是不是闰年,这个月有几天等
public static void main(String[] agrs) {
LocalDate localDate = LocalDate.now();
int intLocalDateMonth = localDate.getDayOfMonth();
ZonedDateTime zonedDateTime = ZonedDateTime.now();
int intZonedDateTimeMonth = zonedDateTime.getDayOfMonth();
System.out.println("intLocalDateMonth:" + intLocalDateMonth);
System.out.println("intZonedDateTimeMonth:" + intZonedDateTimeMonth);
localDate.get();
}
getYear() int 获取当前日期的年份
getMonth() Month 获取当前日期的月份对象
getMonthValue() int 获取当前日期是第几月
getDayOfWeek() DayOfWeek 表示该对象表示的日期是星期几
getDayOfMonth() int 表示该对象表示的日期是这个月第几天
getDayOfYear() int 表示该对象表示的日期是今年第几天
withYear(int year) LocalDate 修改当前对象的年份
withMonth(int month) LocalDate 修改当前对象的月份
withDayOfMonth(int dayOfMonth) LocalDate 修改当前对象在当月的日期
isLeapYear() boolean 是否是闰年
lengthOfMonth() int 这个月有多少天
lengthOfYear() int 该对象表示的年份有多少天(365或者366)
plusYears(long yearsToAdd) LocalDate 当前对象增加指定的年份数
plusMonths(long monthsToAdd) LocalDate 当前对象增加指定的月份数
plusWeeks(long weeksToAdd) LocalDate 当前对象增加指定的周数
plusDays(long daysToAdd) LocalDate 当前对象增加指定的天数
minusYears(long yearsToSubtract) LocalDate 当前对象减去指定的年数
minusMonths(long monthsToSubtract) LocalDate 当前对象减去注定的月数
minusWeeks(long weeksToSubtract) LocalDate 当前对象减去指定的周数
minusDays(long daysToSubtract) LocalDate 当前对象减去指定的天数
compareTo(ChronoLocalDate other) int 比较当前对象和other对象在时间上的大小,返回值如果为正,则当前对象时间较晚,
isBefore(ChronoLocalDate other) boolean 比较当前对象日期是否在other对象日期之前
isAfter(ChronoLocalDate other) boolean 比较当前对象日期是否在other对象日期之后
isEqual(ChronoLocalDate other) boolean 比较两个日期对象是否相等
时间计算的类
Calendar 首先这是一个抽象类 不能实例化,对此,Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象,getInstance方法返回一个Calendar对象(该对象为Calendar的子类对象)
Date date = new Date();
int hour = 0;
int min = 0;
int sec = 0;
Calendar cal = Calendar.getInstance();
if (null != date) {
cal.setTime(date);
}
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, min);
cal.set(Calendar.SECOND, sec);
cal.set(Calendar.MILLISECOND, 0);
Date beginOfADay = cal.getTime();
//想加五天
public static Date addDate(Date date, int day) {
if (null == date) {
return null;
} else {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + day);
return calendar.getTime();
}
}
Calendar里面有表示各种时间的枚举,通过上面的方法可以看到 如何去做加减法,在相应的位置做加减法就行了,之前说Date是相当于一个时间戳和人类语言的年月日无关,那么Calendar就完全就是年月日时分秒的日历,日历怎么做加减法? ->在相应的位置翻就行了
LocalTime nowTime = LocalTime.now(); LocalTime afterTime = nowTime.plusHours(12); System.out.printf(""+ nowTime.until(afterTime,MINUTES));
LocalTime 计算就这么简单until 后面跟一个单位就行
格式化时间的类
DateTimeFormatter java8新增 线程安全 final类 没有继承父类也没有实现接口
SimpleDateFormat 之前的格式化类 线程不安全 继承于DateFormat format 和parse都不安全
因为这两个方法里面都用到了calendar 这是一个类变量 也就是对一个java实例 他是共享的 ,SimpleDateFormat通过对这个共享变量set get必然会出现线程不安全的情况,所以在多线程场景下用同一个SimpleDateFormat 最后解析或者格式化出来的东西可能对不上
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Date date1 = new Date();
String date1Str = format.format(date1);
try {
Date date2 = format.parse(date1Str);
} catch (ParseException e) {
e.printStackTrace();
}
DateTimeFormatter也差不多
//当前日期时间,没有时区
LocalDateTime now = LocalDateTime.now();
//日期格式化,通用时间表达式
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
//2018-11-29 08:08:24
String nowStr = fmt.print(now);
参考:https://blog.csdn.net/zhangbin666/article/details/78969896