Java8特性之时间API

JDK8特性之时间API

LocalDate、LocalDateTIme、LocalTIme
方法 描述
now()/* now(Zoneld zone) 静态方法,根据当前时间创建对象/指定时区的对象
of() 静态方法,根据指定日期/时间创建对象
getDayOfMonth()/getDayOfYear() 获取月份天数(1-31)/获取年份天数(1~366)
getDayOfWeek() 获取星期几(返回一个DayOfWeek枚举值)
getMonth() 获取月份,返回一个Month枚举值
getMonthValue()/getYear() 获取鱼粉(1-12)/获取年份
getHour()/getMinute()/getSeconde() 获取当前对象对应的小时、分钟、秒
withDayOfMonth()/withDayOfYear()/withMonty()/withYear() 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
plusDays()/plusWeeks()/plusMonths()/plusYears()/plusHours() 向当前对象添加几天、几周、几个月、几年、几小时
minusMonths()/minusWeeks()/minusDays()/minusYears()/minusHours() 从当前对象减去几月、几周、几天、几年、几小时
  • 代码示例
package com.felixfei.study.test;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

import java.util.Date;


/**
 * 为什么会出现新的日期API
 * 1. 可变性:像日期和时间这样的类应该是不可变的(calendar是可变的,修改的是本身的值)
 * 2. 偏移性:Date中的年份是从1900年开始的,而月份都从0开始
 * 3. 格式化:格式化只对Date有用,Calendar则不行
 * 4. 此外,他们也不是线程安全的,不能处理闰秒等
 */
public class LocalDateTimeTest {
    public static void main(String[] args) {
        // 获取2021年3月22号的时间,要进行偏移量计算
        Date date = new Date(2021 - 1900, 3 - 1, 22);
        System.out.println("2021年3月22号时间为:" + date);

        // LocalDate、LocalDateTime、LocalTime
        LocalDate now = LocalDate.now();
        LocalDateTime now1 = LocalDateTime.now();
        LocalTime now2 = LocalTime.now();
        System.out.println("当前日期:" + now);
        System.out.println("当时间:" + now1);
        System.out.println("当前日期时间:" + now2);

        // 获取指定的日期时间,没有偏移量
        LocalDateTime of = LocalDateTime.of(2020, 3, 10, 22, 12, 13);
        System.out.println("指定的日期时:" + of);

        System.out.println("当月的第几天:" + now.getDayOfMonth());
        System.out.println("这周的第几天:" + now.getDayOfWeek());
        System.out.println("第几月:" + now.getMonth());
        System.out.println("月份数值:" + now.getMonthValue());
        System.out.println("今天的第几天:" + now.getDayOfYear());

        // 不可变性,修改的返回是新的值
        LocalDate localDate = now.withDayOfMonth(23);
        System.out.println("修改天数后的值:" + localDate);

        LocalDate localDate1 = now.plusDays(2);
        System.out.println("增加1天后的值:" + localDate1);

        LocalDate localDate2 = now.minusDays(6);
        System.out.println("减6天后的值:" + localDate2);
    }
}

Instant
  • Instant:时间线上的一个瞬时点。这可能被用来记录应用程序中的事件时间戳。
  • 在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是事件的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为单位:同样的,在Java中,也是从1970年开始,但以毫秒为单位。
  • java.time包通过值类型Instant提供机器试图,不提供处理人类意义上的时间单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如:时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数,因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。
方法 描述
now() 静态方法,返回默认UTC时区的Instant类的对象
ofEpochMilli(long epochMilli) 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
atOffset(ZoneOffset offset) 结合即时的创建一个OffsetDateTime
toEpochMilli() 返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
  • 时间戳是指格林威治时间1970年01月01日00时00分00起至现在的总秒数
package com.felixfei.study.test;

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

/**
 * Instant:时间线上的一个瞬时点,这可能被用来记录应用程序中的事件时间戳。
 * 类似于java.util.Date类
 */
public class LocalDateTimeTest {
    public static void main(String[] args) {
        Instant now = Instant.now(); // 获取的是本初子午线的时间
        System.out.println("获取的是本初子午线的时间=" + now);

        OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.of("+8"));
        System.out.println("获取的东八区的时间=" + offsetDateTime);

        long l = now.toEpochMilli();
        System.out.println("获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数=" + l);

        Instant instant = Instant.ofEpochMilli(l);
        System.out.println("通过给定的毫秒数,获取的Instant实例=" + instant);
    }
}

DateTimeFormatter类
  • 该类提供了三种格式化时间方法
  • 自动以格式,如:ofPattern("yyyy-MM-dd hh:mm:ss E")
方法 描述
ofPattern(String pattern) 静态方法,返回一个指定字符串格式的DateTImeFormatter
format(TemproalAccessor t) 格式化一个日期、时间,返回字符串
parse(CharSequence text) 将指定格式的字符序列解析为一个日期、时间
package com.felixfei.study.test;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;


public class LocalDateTimeTest {
    public static void main(String[] args) {
        DateTimeFormatter isoDate = DateTimeFormatter.ISO_DATE;
        String str1 = isoDate.format(LocalDateTime.now());
        System.out.println("格式化后的字符串日期=" + str1);

        TemporalAccessor parse = isoDate.parse(str1);
        System.out.println("字符串解析后的日期=" + parse);

        // FormatStyle.LONG  2021年3月24日 下午08时53分19秒 可使用 ofLocalizedDateTime 方法
        // FormatStyle.MEDIUM  2021-3-24 20:55:10 可使用 ofLocalizedDateTime 方法
        // FormatStyle.SHORT  21-3-24 下午8:55 可使用 ofLocalizedDateTime 方法
        // FormatStyle.FULL  2021年3月24日 星期三 这种要使用 ofLocalizedDate 方法
        DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
        String format = formatter.format(LocalDateTime.now());
        System.out.println("格式化对应样式后的日期时间字符串=" + format);

        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String format1 = formatter1.format(LocalDateTime.now());
        System.out.println("格式化对应样式后的日期字符串=" + format1);

        TemporalAccessor parse1 = formatter1.parse(format1);
        System.out.println("字符串解析后的日期=" + parse1); // 注意字符串的格式必须和ofPattern中的一致

        System.out.println("获取解析后的年="+parse1.get(ChronoField.YEAR));

    }
}

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

推荐阅读更多精彩内容