Java8新的日期时间API

常用类:

LocalDate、LocalTime、LocalDateTime、ZoneOffset、DateTimeFormatter、DateTimeFormatterBuilder

ChronoUnit、ChronoField、IsoFields、Temporal、TemporalAccessor、TemporalField、TemporalAdjuster、TemporalAmount、TemporalAdjusters

-------------------------------------------名词解释-------------------------------------------------

ISO-8601日历系统 - IsoFields(final class)

国际标准化组织的国际标准ISO 8601是日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。目前最新为第三版ISO8601:2004,第一版为ISO8601:1988,第二版为ISO8601:2000。

Julian Days(儒略日)- JulianFields(final class)

Epoch Day: 自1970-01-01(ISO)算起,当天为第0天,之后每天加1。

temporal object: 瞬时对象(表示某一时刻,可以是某一天,某一年,某)

-------------------------------------------类和接口-------------------------------------------------

Temporal 封装操作瞬时对象的方法

TemporalAdjuster:用来自定义瞬时对象调整规则的接口方法

TemporalAdjusters(final):以静态方法的形式提供了一系列常用的瞬时对象调整方法实现(返回TemporalAdjuster的匿名实现)

TemporalUnit: 定义了一些操作时间单位的方法,比如获取时间单位的长度,按指定单位计算两个时间点之间的长度等, ChronoUnit(enum)是它的实现类,并定义了常用时间单位的长度,年、月、日、时、分、秒、周等(除了纳秒、微秒和毫秒以纳秒为单位来表示长度外,其他单位都以秒来表示长度,比如1分钟=60秒,一天=86400秒)

TemporalField定义了对时间字段,比如某一月、某一年、某分钟的操作方法;ChronoField(enum)是它的实现类,并定义了常用时间单位的数值范围,比如按小时(MINUTE_OF_HOUR)算,那么分钟是0~59,如果按日(MINUTE_OF_DAY)算,那么则是0~(60*24)-1)

Instant(final)TemporalTemporalAdjuster接口的实现类,用来表示时间线上的某一点,可以看成时间戳,也是线程安全的。可通过Instant来进行新旧日期的转换,例如:

Date d0 = new Date();

Instant i0 = d0.toInstant();

LocalDateTime ldt0 = LocalDateTime.ofInstant(i0, ZoneId.systemDefault())

LocalDate ld0 = ldt0.toLocalDate();

LocalTime lt0 =  ldt0.toLocalTime();

d0 = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()); //LocalDateTime->Instant->Date

LocalDate、LocalTime、LocalDateTime:均是Temporal和TemporalAdjuster接口的实现类且是定义为final,不可继承且是线程安全的;每次对这些对象的修改都会创建一个新的瞬时对象。

TemporalAmount:  用来表示在某个时间单位上的时间数量,例如几天,几分钟,几小时等

Duration(final): TemporalAmount 接口的实现类,用来表示某一时段的长度

Period(final)-> ChronoPeriod -> TemporalAmount: 与Duration的区别是Duration同一时刻只能一种时间单位来表示时段长度,Period可以用多个单位来表示,比如

Period p = Period.between(LocalDate.now().plusDays(1), LocalDate.now().with(TemporalAdjusters.lastDayOfYear()).plusDays(1));

System.out.println("距离今年结束还剩下:: " + String.format("%d years, %d months, %d days", p.getYears(), p.getMonths(), p.getDays()));

ZoneOffset(final): 时区偏移值,通过偏移值将当前时区时间换算到指定时区的时间

周数计算:

System.out.println("按照自然星期算, 周一~周日为一周,2020年1月1日是20年第几周 : " + LocalDate.of(2020, 1, 1).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));

System.out.println("按照自然星期算, 周一~周日为一周,2020年1月6日是20年第几周 : " + LocalDate.of(2020, 1, 6).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));

System.out.println("从当年第一天算起,每7天为一周,2020年1月7日是20年第几周 : " + LocalDate.of(2020, 1, 7).get(ChronoField.ALIGNED_WEEK_OF_YEAR));

----------------------------------------------------新旧时间类对比----------------------------------------------

1) Date类年份是以1900年为起点的,设置的时候,负值表示1900年-去该值的年份,正值表示1900+该值的年份; 新的日期支持9位数的正负年值

Date d = new Date(-1,8,25);  //表示1899年8月25日

d.setYear(10);  //则该日期变成了1910年8月25日

2)Date使用长整型数值表示时,则是以1970年0时区为中心点, 对应0,负数表示1970年前的日期,正数表示1970年后的日期

d.setTime(0); //则修改上面的日期变成1970-01-01 00:00:00,需要注意的是,此时是Greenwich时区的0时,如果将日期格式化时,会按照实际时区计算,比如在+8时区,则格式化后是1970-01-01 08:00:00,即Date实例所代表的时间是携带时区信息的,在不同时区会进行自动换算,新的时间对象表示的时间则不带时区信息。

new Date(-28800000); //这个日期在+8时区表示1970-01-01 00:00:00,在Greenwich时区则表示1969-12-31 16:00:00;

3)Calendar类支持直接设置1900年前的日期,但使用数值设置日期时跟Date一样是从1970-01-01 00:00:00开始的,

Calendar.getInstance().setTimeInMillis(1000); //表示1970-01-01 00:00:01 

4)Date和Calendar的实例所表示的时间值均是可以修改的,新的时间对象表示的时间值不可修改,每次修改都是生成新的时间对象。

5)我们使用SimpleDateFormat对Date实例进行格式化,SimpleDateFormat扩展DateFormat抽象类,使用一个全局变量Calendar实例来保存时间,在多个线程中使用同个SimpleDateFormat来格式化或者解析日期时会出现异常,是非线程安全的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355