java中date的构造(Java好用的时间类别再用Date了)
假设你想获取当前时间,那么你肯定看过这样的代码,下面我们就来聊聊关于java中date的构造?接下来我们就一起去了解一下吧!
java中date的构造
前言假设你想获取当前时间,那么你肯定看过这样的代码
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 <code>Date</code> 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 <code>Calendar.get(Calendar.YEAR) - 1900</code>.
*/
@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)=1 正好为1月,那11月增加一个月,(11 1)=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.HOURCalendar.HOUR_OF_DAYCalendar.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 都有类似作用的apiLocalDate.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有个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 LocalTimePeriod 只能用LocalDateDuration 持续时间,所以LocalDate、LocalTime、LocalDateTime 都能处理至于Calendar 日历类,这里面的api,都是针对日历的,比如这个月的第一天是星期几。总体来说,都是api的使用,非常清晰,废弃date.getMonth()等,使用localDate.getMonthValue()来获取几月,更易理解,更易贴合使用。代码都贴在了github上了
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com