城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

Java好用的时间类,别再用Date了

1月21日 霸鲸观投稿
  前言
  假设你想获取当前时间,那么你肯定看过这样的代码publicstaticvoidmain(String〔〕args){DatedatenewDate(System。currentTimeMillis());System。out。println(date。getYear());System。out。println(date。getMonth());System。out。println(date。getDate());}
  获取年份,获取月份,获取。。日期?
  运行一下121927
  怎么回事?获取年份,日期怎么都不对,点开源码发现Returnsavaluethatistheresultofsubtracting1900fromtheyearthatcontainsorbeginswiththeinstantintimerepresentedbythiscodeDateobject,asinterpretedinthelocaltimezone。returntheyearrepresentedbythisdate,minus1900。seejava。util。CalendardeprecatedAsofJDKversion1。1,replacedbyCalendar。get(Calendar。YEAR)1900。DeprecatedpublicintgetYear(){returnnormalize()。getYear()1900;}code
  原来是某个对象值减去了1900,注释也表示,返回值减去了1900,难道我们每次获取年份需要在加上1900?注释也说明了让我们用Calendar。get()替换,并且该方法已经被废弃了。点开getMonth()也是一样,返回了一个0到11的值。getDate()获取日期?不应该是getDay()吗?老外的day都是sunday、monday,getDate()才是获取日期。再注意到这些api都是在1。1的时候被废弃了,私以为是为了消除getYear减去1900等这些歧义。收Calendar日历类publicstaticvoidmain(String〔〕args){CalendarcalendarCalendar。getInstance();intyearcalendar。get(Calendar。YEAR);intmonthcalendar。get(Calendar。MONTH);intdomcalendar。get(Calendar。DAYOFMONTH);intdoycalendar。get(Calendar。DAYOFYEAR);intdowcalendar。get(Calendar。DAYOFWEEK);intdowimcalendar。get(Calendar。DAYOFWEEKINMONTH);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月113,没有13月。假设区域,(121)121正好为1月,那11月增加一个月,(111)120,这就有问题了。所以为了计算方便1月,返回了0值。date。getMonth()也是一个道理。问:那下面的DAYOFXXX又是什么意思?
  答:猜!根据结果猜。
  Calendar。DAYOFMONTH在这个月的这一天
  Calendar。DAYOFYEAR在这一年的这一天
  Calendar。DAYOFWEEK在这一周的这一天
  Calendar。DAYOFWEEKINMONTH在这一个月这一天在第九周
  到这里Calendar。DAYOFWEEK为什么是4,你肯定也猜到了
  Calendar。HOUR
  Calendar。HOUROFDAY
  Calendar。SECOND
  。。。其他的你肯定也会用了LocalDate本地日期类LocalDatelocalDateLocalDate。now();System。out。println(当前日期:localDate。getYear()年localDate。getMonthValue()月localDate。getDayOfMonth()日);结果当前日期:2021年10月27日
  也可以通过LocalDate。of(年,月,日)去构造LocalDatepluslocalDatelocalDate。plusDays(1);增加一天LocalDatepluslocalDatelocalDate。plusYears(1);增加一年
  其他apiLocalDate。isBefore(LocalDate);LocalDate。isAfter();LocalDate。isEqual();
  也就是对两个日期的判断,是在前、在后、或者相等。LocalTime本地时间类LocalTimelocalTimeLocalTime。now();System。out。println(当前时间:localTime。getHour()hlocalTime。getSecond()mlocalTime。getMinute()s);
  LocalDate和LocalTime都有类似作用的api
  LocalDate。plusDays(1)增加一天
  LocalTime。plusHours(1)增加一小时等等
  其他apiLocalTime。isBefore(LocalTime);LocalTime。isAfter();
  对两个时间的判断。肯定碰到过一个需求,今天离活动开始时间还剩多少天。LocalDateTime本地日期时间类publicfinalclassLocalDateTime。。。{privatefinalLocalDprivatefinalLocalT}
  LocalDateTimeLocalDateLocalTime懂得都懂Instant类
  Instant是瞬间,某一时刻的意思Instant。ofEpochMilli(System。currentTimeMillis())Instant。now()
  通过Instant可以创建一个瞬间对象,ofEpochMilli()可以接受某一个瞬间,比如当前时间,或者是过去、将来的一个时间。
  比如,通过一个瞬间创建一个LocalDateTime对象LocalDateTimenowLocalDateTime。ofInstant(Instant。ofEpochMilli(System。currentTimeMillis()),ZoneId。systemDefault());System。out。println(当前日期:now。getYear()年now。getMonthValue()月now。getDayOfMonth()日);Period类
  Period是时期,一段时间的意思
  Period有个between方法专门比较两个日期的LocalDatestartDateLocalDateTime。ofInstant(Instant。ofEpochMilli(1601175465000L),ZoneId。systemDefault())。toLocalDate();1601175465000是202092710:57:45PeriodpPeriod。between(startDate,LocalDate。now());System。out。println(目标日期距离今天的时间差:p。getYears()年p。getMonths()个月p。getDays()天);目标日期距离今天的时间差:1年1个月1天
  看一眼源码publicstaticPeriodbetween(LocalDatestartDateInclusive,LocalDateendDateExclusive){returnstartDateInclusive。until(endDateExclusive);}publicPerioduntil(ChronoLocalDateendDateExclusive){LocalDateendLocalDate。from(endDateExclusive);longtotalMonthsend。getProlepticMonth()this。getProlepticMonth();safeintdaysend。daythis。if(totalMonths0days0){totalMLocalDatecalcDatethis。plusMonths(totalMonths);days(int)(end。toEpochDay()calcDate。toEpochDay());safe}elseif(totalMonths0days0){totalMdaysend。lengthOfMonth();}longyearstotalMonths12;safeintmonths(int)(totalMonths12);safereturnPeriod。of(Math。toIntExact(years),months,days);}
  他只接受两个LocalDate对象,对时间的计算,算好之后返回Period对象Duration类
  Duration是期间持续时间的意思上代码LocalDateTimeendLocalDateTime。ofInstant(Instant。ofEpochMilli(System。currentTimeMillis()),ZoneId。systemDefault());LocalDateTimestartLocalDateTime。ofInstant(Instant。ofEpochMilli(1601175465000L),ZoneId。systemDefault());DurationdurationDuration。between(start,end);System。out。println(开始时间到结束时间,持续了duration。toDays()天);System。out。println(开始时间到结束时间,持续了duration。toHours()小时);System。out。println(开始时间到结束时间,持续了duration。toMillis()1000秒);
  可以看到between也接受两个参数,LocalDateTime对象,源码是对两个时间的计算,并返回对象。对象转换
  再贴点apilongLocalDateTimeLocalDateTime。ofInstant(Instant。ofEpochMilli(timestamp),ZoneId。systemDefault())StringLocalDateTimeDateTimeFormatterdateTimeFormatter1DateTimeFormatter。ofPattern(yyyyMMddHH:mm:ss);LocalDateTime。parse(2021102800:00:00,dateTimeFormatter1);LocalDateTimelongLocalDateTime对象。atZone(ZoneId。systemDefault())。toInstant()。toEpochMilli();LocalDateTimeStringDateTimeFormatterdateTimeFormatter1DateTimeFormatter。ofPattern(yyyyMMddHH:mm:ss);LocalDateTime对象。format(dateTimeFormatter1)
  对象转换几乎都涵盖了,里面有个时区对象,这个一般用默认时区。总结
  用LocalDate、LocalTime、LocalDateTime代替了Date类。Date管日期,Time管时间
  LocalDateTimeLocalDateLocalTime
  Period只能用LocalDate
  Duration持续时间,所以LocalDate、LocalTime、LocalDateTime都能处理
  至于Calendar日历类,这里面的api,都是针对日历的,比如这个月的第一天是星期几。
  总体来说,都是api的使用,非常清晰,废弃date。getMonth()等,使用localDate。getMonthValue()来获取几月,更易理解,更易贴合使用。代码都贴在了github上了
投诉 评论 转载

甘肃张掖祁连山下奏响新时代双拥欢歌中国工农红军西路军留下的红色血脉始终绵延。近年来,地处河西走廊中段、祁连山脉北麓的甘肃省张掖市坚持大双拥、一盘棋理念,着眼新时代拥军优属新任务,以爱军队、懂军人、善拥军为价值导……福建莆田首个退役军人就业创业服务平台正式上线近日,福建省莆田市退役军人就业创业服务平台正式上线。该平台是由莆田市退役军人事务局联合福建海峡人才网络资讯有限公司联合建设开发的福建省首个市域平台。据悉,该平台基于莆田市……5月18日要闻回顾李克强稳地价稳房价,支持居民合理住房需求工【李克强:稳地价稳房价,支持居民合理住房需求】5月18日,中共中央政治局常委、国务院总理李克强在云南主持召开稳增长稳市场主体保就业座谈会。李克强说,要用改革办法解决前进中的困难……慈禧太后的最后一天用膳到一半突然昏迷,临终匆匆留下三句遗言1908年11月14日,光绪皇帝驾崩,后事落在了养母慈禧手中。那日,慈禧忙于光绪后事直到深夜方才休息,但第二天早上她仍像平常一样6点起床梳妆用膳,心情还挺不错。可谁……喝什么饮料或吃什么水果可以快速解酒?并没有什么水果或者饮料能快速解酒。茶、咖啡、蜂蜜水等等并没有网传的那些神奇解酒效果,某些时候还可能加重身体不适。最好的方法还是少喝酒,从根源上减少酒精摄入量,不要喝到需要……明日小满,要懂得忌嘴,牢记食3肉吃5菜忌2样,为盛夏做准备民谚曰:小满,江河渐满,到了夏季第二个节气小满,天气炎热,降雨充沛,真正的夏季到来了。小满二字展现的不仅是一个节气,在人生中也是一种和润而远的心态,小得盈满,自在欢喜。好……Supreme意大利百年陶器PoggiUgo双携手,联名陶器近来,突起于潮流界的意大利PoggiUgo手工陶盆身价飙涨,盖因他们和Supreme携起手来。在意大利Impruneta村,陶土非常独特,也拥有着古老的制陶文化。早于文艺……在游戏三国志11南蛮征伐剧本中,孟获如何防御蜀国大军的进攻?大家好,欢迎乘坐游戏探索机!说到《三国志11》后期的历史剧本,由于可供选择的势力数较少,而且名将大多死去,所以很多人觉得玩起来会很乏味。不过其中有一个势力趣味性不错,虽然……Java好用的时间类,别再用Date了前言假设你想获取当前时间,那么你肯定看过这样的代码publicstaticvoidmain(String〔〕args){DatedatenewDate(System。cu……吕布和陈宫为什么在兖州争夺战中败给曹操?主要是两方面的失误公元194年农历4月,陈宫和陈留太守张邈联合兖州豪强和士族趁曹操倾巢出动攻打徐州之际,秘密地迎接吕布入兖州,发动了兖州政变。兖州顷刻之间发生了倾覆,原属于曹操的兖州八郡,只有济……你是为人民币服务,还是为儿女服务,人这辈子,你到底活明白没有为人民币服务也罢,为儿女服务也罢,这个问题早己明白得很,其实两者集于一身,简单地说人生都是为自己一人服务。人民币是生身之源,住,吃,穿需要它,必须首先考虑的重大问题。有了……魏明帝派人送来棉服,司马懿宁可士兵冻死也不发,多年后知其高明东汉末年是个混乱的时段,在历史的那段长河中,有无数的英雄人物如星星般璀璨着,司马懿则无疑是其中耀眼的一个,他是三国时期最大的赢家,也是那混乱年代的终结者。有人说司马懿之所……
成游戏厂商固定合作伙伴,星图游戏是怎么深挖长效经营价值的?云南铜业加息节奏预计会干扰铜价运行,短期内或将出现价格波动,临终老人总掀被子还能坚持多久?退休证有三种颜色,分别代表什么意思?四大天王谁的颜值最高?一个家庭,一年能攒多少钱?20年后的小米会有华为如今的成就吗?盘点东北抗日十大名将,关东军悬赏抓捕一两黄金一两骨中国喷气式客机首次进入海外市场!国产ARJ21商业运营走出国如皋王惟熙(11)王惟熙三任贡举考官的那些进士在佛山年薪多少才能买车买房?慈禧人生中背的最大的锅,珍妃真的是被慈禧投入井中的吗?
养老金上调即将开始!3000以下再涨200,达到5000不涨尼康DF支持防抖吗?尼康DF支持自拍吗?手捧空花盆的孩子现行刑法对环境监管失职罪立案是怎么规定的一朵花开的时间黑色空城年级工作计划蒲公英的一生江浙沪十大冷门景点,人少景美好玩游动漫节五年级作文高温干旱对草莓有什么危害?代理记账合同凉席有甲醛吗?哪些凉席有甲醛?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁