JavaEE在线就业班2.0【最新升级版】fzsfsz

download:JavaEE在线就业班2.0【最新升级版】

假定你想获取当前时间,那么你肯定看过这样的代码

public static void main(String[] args) {

Date date = new Date(System.currentTimeMillis());
System.out.println(date.getYear());
System.out.println(date.getMonth());
System.out.println(date.getDate());

}
复制代码
获取年份,获取月份,获取..日期?
运转一下

121
9
27
复制代码
怎样回事?获取年份,日期怎样都不对,点开源码发现

/**

  • Returns a value that is the result of subtracting 1900 from the
  • year that contains or begins with the instant in time represented
  • by this Date object, as interpreted in the local
  • time zone.
    *
  • @return the year represented by this date, minus 1900.
  • @see java.util.Calendar
  • @deprecated As of JDK version 1.1,
  • replaced by Calendar.get(Calendar.YEAR) - 1900.
    */

@Deprecated
public int getYear() {

return normalize().getYear() - 1900;

}
复制代码
原来是某个对象值 减去了 1900,注释也表示,返回值减去了1900,难道我们每次获取年份需求在 加上1900?注释也阐明了让我们 用Calendar.get()交换,并且该办法曾经被废弃了。点开getMonth()也是一样,返回了一个0到11的值。getDate()获取日期?不应该是getDay()吗?老外的day都是sunday、monday,getDate()才是获取日期。再留意到这些api都是在1.1的时分被废弃了,私以为是为了消弭getYear减去1900等这些歧义。收~

Calendar 日历类
public static void main(String[] args) {

Calendar calendar =  Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int dom = calendar.get(Calendar.DAY_OF_MONTH);
int doy = calendar.get(Calendar.DAY_OF_YEAR);
int dow = calendar.get(Calendar.DAY_OF_WEEK);
int dowim = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH);
System.out.println(year+"年"+ month+"月");
System.out.println(dom+"日");
System.out.println(doy+"日");
System.out.println(dow+"日");
System.out.println(dowim);

}
复制代码
打印(运转时间2021年10月27日 星期三 晴)

2021年9月
27日
300日
4日
4
复制代码
问:月份怎样是上个月的?
答:是为了计算便当,月是0到11之间的值。
问:计算便当?
答:比方月份从1月开端,增加一个月,12月+1=13,没有13月。假定取余,(12+1)%12=1 正好为1月,那11月增加一个月,(11+1)%12=0,这就有问题了。所以为了计算便当1月,返回了0值。date.getMonth()也是一个道理。 问:那下面的DAY_OF_XXX 又是什么意义?
答:猜!依据结果猜。
Calendar.DAY_OF_MONTH 在这个月 的这一天
Calendar.DAY_OF_YEAR 在这一年 的这一天
Calendar.DAY_OF_WEEK 在这一周 的这一天
Calendar.DAY_OF_WEEK_IN_MONTH 在这一个月 这一天在 第几周
到这里 Calendar.DAY_OF_WEEK 为什么是 4 ,你肯定也猜到了
Calendar.HOUR
Calendar.HOUR_OF_DAY
Calendar.SECOND
...其他的 你肯定也会用了

LocalDate 本地日期类
LocalDate localDate = LocalDate.now();
System.out.println("当前日期:"+localDate.getYear()+" 年 "+localDate.getMonthValue()+" 月 "+localDate.getDayOfMonth()+"日" );
//结果
当前日期:2021 年 10 月 27日
复制代码
也能够经过 LocalDate.of(年,月,日)去结构

LocalDate pluslocalDate = localDate.plusDays(1);//增加一天
LocalDate pluslocalDate = localDate.plusYears(1);//增加一年
复制代码
其他api

LocalDate.isBefore(LocalDate);
LocalDate.isAfter();
LocalDate.isEqual();
复制代码
也就是对两个日期的判别,是在前、在后、或者相等。

LocalTime 本地时间类
LocalTime localTime = LocalTime.now();
System.out.println("当前时间:"+localTime.getHour()+"h "+localTime.getSecond()+"m "+localTime.getMinute()+"s" );
复制代码
LocalDate和LocalTime 都有相似作用的api
LocalDate.plusDays(1) 增加一天
LocalTime.plusHours(1) 增加一小时 等等~
其他api

LocalTime.isBefore(LocalTime);
LocalTime.isAfter();
复制代码
对两个时间的判别。肯定碰到过一个需求,今天离活动开端时间还剩几天。

LocalDateTime 本地日期时间类
public final class LocalDateTime ...{


private final LocalDate date;
private final LocalTime time;

}
复制代码
LocalDateTime = LocalDate + LocalTime 懂的都懂

Instant 类
Instant 是霎时,某一时辰的意义

Instant.ofEpochMilli(System.currentTimeMillis())
Instant.now()
复制代码
经过Instant能够创立一个 “霎时” 对象,ofEpochMilli()能够承受某一个“霎时”,比方当前时间,或者是过去、未来的一个时间。
比方,经过一个“霎时”创立一个LocalDateTime对象

LocalDateTime now = LocalDateTime.ofInstant(

Instant.ofEpochMilli(System.currentTimeMillis()),ZoneId.systemDefault());

System.out.println("当前日期:"+now.getYear()+" 年 "+now.getMonthValue()+" 月 "+now.getDayOfMonth()+"日" );
复制代码
Period 类
Period 是 时期,一段时间 的意义
Period有个between办法特地比拟两个 日期 的

LocalDate startDate = LocalDateTime.ofInstant(

Instant.ofEpochMilli(1601175465000L), ZoneId.systemDefault()).toLocalDate();//1601175465000是2020-9-27 10:57:45

Period p = Period.between(startDate, LocalDate.now());
System.out.println("目的日期间隔今天的时间差:"+p.getYears()+" 年 "+p.getMonths()+" 个月 "+p.getDays()+" 天" );
//目的日期间隔今天的时间差:1 年 1 个月 1 天
复制代码
看一眼源码

public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive) {

return startDateInclusive.until(endDateExclusive);

}
public Period until(ChronoLocalDate endDateExclusive) {

LocalDate end = LocalDate.from(endDateExclusive);
long totalMonths = end.getProlepticMonth() - this.getProlepticMonth();  // safe
int days = end.day - this.day;
if (totalMonths > 0 && days < 0) {
    totalMonths--;
    LocalDate calcDate = this.plusMonths(totalMonths);
    days = (int) (end.toEpochDay() - calcDate.toEpochDay());  // safe
} else if (totalMonths < 0 && days > 0) {
    totalMonths++;
    days -= end.lengthOfMonth();
}
long years = totalMonths / 12;  // safe
int months = (int) (totalMonths % 12);  // safe
return Period.of(Math.toIntExact(years), months, days);

}
复制代码
他只承受两个LocalDate对象,对时间的计算,算好之后返回Period对象

Duration 类
Duration 是 期间 持续时间 的意义 上代码

LocalDateTime end = LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault());
LocalDateTime start = LocalDateTime.ofInstant(Instant.ofEpochMilli(1601175465000L), ZoneId.systemDefault());
Duration duration = Duration.between(start, end);
System.out.println("开端时间到完毕时间,持续了"+duration.toDays()+"天");
System.out.println("开端时间到完毕时间,持续了"+duration.toHours()+"小时");
System.out.println("开端时间到完毕时间,持续了"+duration.toMillis()/1000+"秒");
复制代码
能够看到between也承受两个参数,LocalDateTime对象,源码是对两个时间的计算,并返回对象。

对象转换
再贴点api

//long -> LocalDateTime
LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault())
//String -> LocalDateTime
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime.parse("2021-10-28 00:00:00", dateTimeFormatter1);
//LocalDateTime -> long
LocalDateTime对象.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
//LocalDateTime -> String
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime对象.format(dateTimeFormatter1)
复制代码
对象转换简直都涵盖了,里面有个时区对象,这个普通用默许时区。

总结
用LocalDate、LocalTime、LocalDateTime替代了Date类。Date管日期,Time管时间
LocalDateTime = LocalDate + LocalTime
Period 只能用LocalDate
Duration 持续时间,所以LocalDate、LocalTime、LocalDateTime 都能处置
至于Calendar 日历类,这里面的api,都是针对日历的,比方这个月的第一天是星期几。
总体来说,都是api的运用,十分明晰,废弃date.getMonth()等,运用localDate.getMonthValue()来获取几月,更易了解,更易贴合运用。

你可能感兴趣的:(java-ee)