PRELOADER

本站基于Hexo创建,收藏java相关技术文档。

当前文章 : 《java8部分时间API测试》

3/18/2019 —— 

java8部分时间API测试

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.time.format.TextStyle;
import java.time.temporal.*;
import java.util.Locale;

/**
 * <p>
 *
 * @author TTH
 * @date 2018/7/9
 */

@RunWith(JUnit4.class)
public class JDK8TimeTest {


    /**
     * Chrono时间单元
     *
     * {@link ChronoField}计时单元、{@link ChronoUnit}时间单位
     */
    @Test
    public void testChrono(){
        LocalDate now = LocalDate.now();
        System.out.println(now.getEra());
        System.out.println(now.getYear());
        System.out.println(now.get(ChronoField.YEAR));//获取时间中的某个计时单元
        System.out.println(now.isSupported(ChronoField.HOUR_OF_DAY));//检测当前时间是否支持指定计时单元
        System.out.println(ChronoField.YEAR.isSupportedBy(now));//检测当前时间是否支持指定计时单元

        LocalDate date = now.minus(5, ChronoUnit.DAYS);//指定计时单位
        System.out.println(date);
    }


    /**
     * 日期时间调整器
     *
     * {@link TemporalAdjusters}已经定义了很多常用的时间调整方法供我们使用
     * {@link java.time.temporal.TemporalAdjuster}是一个函数式接口
     */
    @Test
    public void testTemporalAdjuster(){
        //用于调整时间
        LocalDate today = LocalDate.of(2016, Month.JANUARY, 1);
        LocalDate date = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        System.out.println("2016.1.1以后的下个星期一:"+date);
        System.out.println("today的下一年的第一天:"+today.with(TemporalAdjusters.firstDayOfNextYear()));
        System.out.println("today变量的本月最后一个星期天:"+today.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY)));
        System.out.println("today变量前一个星期一:"+today.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)));
        System.out.println("today变量后的第四个星期一:"+today.with(TemporalAdjusters.dayOfWeekInMonth(4,DayOfWeek.MONDAY)));
        System.out.println("指定today变量的具体某一天:"+today.withDayOfMonth(12));
    }

    /**
     * 日期时间查询
     *
     * 设计类似时间调整器,{@link java.time.temporal.TemporalQueries}也是对函数式
     * 接口{@link java.time.temporal.TemporalQuery}的封装
     */
    @Test
    public void testTemporalQuery(){
        //
        TemporalQuery<TemporalUnit> precision = TemporalQueries.precision();
        TemporalQuery<LocalDate> localDate = TemporalQueries.localDate();

        LocalDate today = LocalDate.now();
        System.out.println("today的精确单位是:"+precision.queryFrom(today));
        System.out.println("today的精确单位是:"+today.query(precision));
        System.out.println(today.query(localDate));

        LocalDateTime time = LocalDateTime.now();
        System.out.println("通过precision确定time变量的精确单位:"+precision.queryFrom(time));
        System.out.println("time的query方法自己确定自己的精确单位:"+time.query(precision));

        LocalTime lt = LocalTime.now();
        System.out.println(lt.query(precision));
        System.out.println(lt.query(localDate));

        ZonedDateTime ldt = ZonedDateTime.now();
        System.out.println(ldt.query(precision));
        System.out.println(ldt.query(localDate));
    }


    //---------------------------------------------------------------------
    //                  时期时间格式化和解析
    //---------------------------------------------------------------------

    /**
     * 系统预定义格式化,以常量方式定义在{@link DateTimeFormatter}中
     */
    @Test
    public void testPredefinedFormatter(){
        //格式化本地日期时间LocalDateTime
        DateTimeFormatter dateTime = DateTimeFormatter.ISO_DATE_TIME;
        System.out.println("LocalDateTime"+dateTime.format(LocalDateTime.now()));
        //格式化本地日期LocalDate
        DateTimeFormatter date = DateTimeFormatter.ISO_DATE;
        System.out.println("LocalDate"+date.format(LocalDate.now()));
        //格式化时区日期时间ZonedDateTime
        System.out.println("ZonedDateTime"+dateTime.format(ZonedDateTime.now()));
        System.out.println("ZonedDateTime"+date.format(ZonedDateTime.now()));
    }

    /**
     * 自定义日期时间格式化
     */
    @Test
    public void testCustomFormatter(){

        //本地日起时间格式化演示
        DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("yyyy-MM-dd HH:mm:ss:"+f.format(LocalDateTime.now()));

        DateTimeFormatter f2 = DateTimeFormatter.ofPattern("dd/MM yyyy", Locale.US);
        System.out.println("指定语言环境:"+f2.format(LocalDateTime.now()));

        DateTimeFormatter f3 = f2.withLocale(Locale.CHINA);//更改DateTimeFormatter区域语言环境
        System.out.println("更改后的语言环境是:"+f3.getLocale()+",Zone是:"+f3.getZone()+",格式化后的时间是:"+f3.format(LocalDateTime.now()));

        //指定时区的日期时间格式化
        DateTimeFormatter f4 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        ZoneId z = ZoneId.of("America/Chicago");
        ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.now(), z);//of开头的方法设置时间,等于将指定时区的时间设置为当前时间,
        System.out.println("将美国芝加哥时间指定为本地时间:"+f4.format(zdt));

        ZonedDateTime america = ZonedDateTime.now(z);//获取指定时区的时间现在时间,而非本地现在时间
        System.out.println("美国芝加哥时间现在是:"+f4.format(america));

        //DateTimeFormatterBuilder创建DateTimeFormatter对象,其实DateTimeFormatter的ofPattern方法也能达到这种效果
        String s = new DateTimeFormatterBuilder().appendLiteral("New year in ").appendValue(ChronoField.YEAR).
                appendLiteral(" is on ").appendText(ChronoField.DAY_OF_WEEK, TextStyle.FULL_STANDALONE).toFormatter(Locale.CHINA)
                .format(LocalDateTime.now());
        System.out.println("自建Formatter对象格式化:"+s);

    }

    /**
     * 指定语言区域格式化,{@link DateTimeFormatter#ofLocalizedDateTime(FormatStyle, FormatStyle)}
     */
    @Test
    public void testAssignArea(){
        //经过下面测试,不同地域日期时间格式化,不是每个对应区域都支持全部四种格式
        LocalDate ld = LocalDate.now();
        LocalTime lt = LocalTime.now();
        LocalDateTime ldt = LocalDateTime.of(ld, lt);

        DateTimeFormatter sfd = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
        DateTimeFormatter mfd = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
        DateTimeFormatter lfd = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
        DateTimeFormatter ffd = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);

        DateTimeFormatter sft = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
        DateTimeFormatter mft = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM);
        DateTimeFormatter lft = DateTimeFormatter.ofLocalizedTime(FormatStyle.LONG);
        DateTimeFormatter fft = DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL);

        DateTimeFormatter sfdt = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.US);
        DateTimeFormatter mfdt = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.US);
        DateTimeFormatter lfdt = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).withLocale(Locale.US);
        DateTimeFormatter ffdt = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(Locale.US);

        System.out.println("日期语言环境为中国:");
        System.out.println(sfd.format(ld));
        System.out.println(mfd.format(ld));
        System.out.println(lfd.format(ld));
        System.out.println(ffd.format(ld));
        System.out.println("日期语言环境为美国:");
        System.out.println(sfd.withLocale(Locale.US).format(ld));
        System.out.println(mfd.withLocale(Locale.US).format(ld));
        System.out.println(lfd.withLocale(Locale.US).format(ld));
        System.out.println(ffd.withLocale(Locale.US).format(ld));

        System.out.println("DateTime语言环境为美国:");
        System.out.println(sfdt.format(ldt));
        System.out.println(mfdt.format(ldt));
//        System.out.println(lfdt.format(ldt));
//        System.out.println(ffdt.format(ldt));
        System.out.println("DateTime语言环境为中国:");
        System.out.println(sfdt.withLocale(Locale.CHINA).format(ldt));
        System.out.println(mfdt.withLocale(Locale.CHINA).format(ldt));
        System.out.println(lfdt.withLocale(Locale.CHINA).format(ldt));
//        System.out.println(ffdt.withLocale(Locale.CHINA).format(ldt));

        System.out.println("Time语言环境为中国");
        System.out.println(sft.format(lt));
        System.out.println(mft.format(lt));
        System.out.println(lft.format(lt));
//        System.out.println(fft.format(lt));
        System.out.println("Time语言环境为美国");
        System.out.println(sft.withLocale(Locale.US).format(lt));
        System.out.println(mft.withLocale(Locale.US).format(lt));
//        System.out.println(lft.withLocale(Locale.US).format(lt));
//        System.out.println(fft.withLocale(Locale.US).format(lt));

    }

    /**
     * 日期时间解析
     * {@link DateTimeFormatter}和{@link LocalDateTime}都提供了parse方法,用于将字符串解析为日期时间对象
     */
    @Test
    public void parseDateFromFormatter(){
        //LocalDateTime等日期时间类的parse方法可以直接将字符串解析为对应类型对象
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.parse("2017-05-05 10:33:25", formatter);
        System.out.println(localDateTime);
        System.out.println(localDateTime.from(localDateTime));
        System.out.println(localDateTime.parse("2017-05-05T10:33:25"));

        //DateTimeFormatter的parse方法会将字符串解析为TemporalAccessor类对象,需要调用LocalDate等日期时
        // 间类对象的from方法从TemporalAccessor对象中获取日期时间
        TemporalAccessor parse = formatter.parse("2016-05-05 10:33:25");
        System.out.println(LocalDateTime.from(parse));

        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        TemporalAccessor parse1 = dateFormatter.parse("2017-02-02");
        System.out.println(LocalDate.from(parse1));
        System.out.println(LocalDate.parse("2017-02-02", dateFormatter));

    }
}