那么在写具体的LocalDate前,我们先来看下为什么要在Java8中搞一套新的API呢,因为旧的Date类非常的难用,比如,其中的几个构造方法都被标注为@Deprecated,这里我总结了一些Date的一些问题
下面面是摘自源码的注释 //The value returned is between <code>0</code> and <code>11</code>, with the value <code>0</code> representing January. 上面的注释已经指出了,一月是0,而且这个getMonth()方法明确了是@Deprecated。
/**
* Returns a number representing the month that contains or begins
* with the instant in time represented by this <tt>Date</tt> object.
* The value returned is between <code>0</code> and <code>11</code>,
* with the value <code>0</code> representing January.
*
* @return the month represented by this date.
* @see java.util.Calendar
* @deprecated As of JDK version 1.1,
* replaced by <code>Calendar.get(Calendar.MONTH)</code>.
*/
@Deprecated
public int getMonth() {
return normalize().getMonth() - 1; // adjust 1-based to 0-based
}
而且在我们经常和Date搭配使用的SimpleDateFormat中,parse()中,其中解析的时候,使用了CalendarBuilder calb = new CalendarBuilder();,然后在设置值的时候,是先用 CalendarBuilder的 establish(),establish方法的内容:
//这里是先清空
cal.clear();
...
//然后再设置新的值
cal.setWeekDate(field[MAX_FIELD + WEEK_YEAR], weekOfYear, dayOfWeek);
如果在多个线程中,如果一个线程已经进行了clear(),而另一个线程期望这个值进行读取,可以想象造成的后果,所以如果在多线程中,要么不使用它,要么就要使它是安全的,所以可以:
1. 进行synchronization,虽然这是一个不好的做法 2. 在每个线程中进行单独的实例化,这将造成内存上的消耗,但是这是一个笨办法 3. 最后就是使用ThreadLocal,这是3个方法中最快的(3点建议摘自stackoverflow)
首先让我们来看下包结构。
我们可以看到常用的LocalDate, LocalDateTime, LocalTime.Instant类,这些类都是不可变,并且是线程安全的,没有提供set方法。
而且这个日历包是包括ISO日历和非ISO日历的(也就是公历和非公历)
ISO公历:国际标准ISO 8601,是国际标准化组织的日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》(https://zh.wikipedia.org/wiki/ISO_8601) 比如年由4位数字组成YYYY,或者带正负号的四或五位数字表示±YYYYY。月、日用两位数字表示:MM、DD。只使用数字为基本格式。使用短横线"-"间隔开年、月、日为扩展格式。
非ISO公历:泰国佛教日历,Hijrah日历,Minguo日历
其中LocalDate就是我们的公历,而ThaiBuddhistDate是泰国的佛教日历 输出结果是
当然有了不同的日历就有了转换,看代码
输出是
LocalDate和ThaiBuddhistDate都是Temporal的子类
在LocalDate中,有以下常用的方法,
public static LocalDate now() {
return now(Clock.systemDefaultZone());
}
public static LocalDate now(ZoneId var0) {
return now(Clock.system(var0));
}
public static LocalDate now(Clock var0) {
}
public static LocalDate of(int var0, Month var1, int var2) { ...}
public static LocalDate of(int var0, int var1, int var2) {
}
public static LocalDate ofYearDay(int var0, int var1) {
}
public static LocalDate from(TemporalAccessor var0) {
}
public static LocalDate parse(CharSequence var0) {
return parse(var0, DateTimeFormatter.ISO_LOCAL_DATE);
}
public static LocalDate parse(CharSequence var0, DateTimeFormatter var1) {
Objects.requireNonNull(var1, "formatter");
return (LocalDate) var1.parse(var0, LocalDate::from);
}
在上面的代码中,其中now()方法,还有parse(),of(),是比较常用的方法,
输出是
可以看出,使用起来还是很方便的
LocalTime是一个不可变类,其实例表示人类可读格式的时间。它的默认格式是hh:mm:ss.zzz。
输出是
基本和LocalDate一样,这里不做太多叙述
输出是
我现在的时间是2018年10月9日21点02,输出是
接下来是java8 时间API的一些基本应用 1.转Date
2.转String now.toString()
3.一般用法
4.String转LocalDate
也可以自己自定义格式
5.取相关的日期
6.取具体时间
7.时间比较