Java 1.8 日期时间小记

导读:本篇文章讲解 Java 1.8 日期时间小记,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

import org.junit.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.util.Date;
import java.util.Set;

public class TimeTest {

    /**
     * Instant:An instantaneous(瞬间的) point on the time-line.
     */
    @Test
    public void testInstant() {
        Instant now = Instant.now();

        System.out.println(now.toString());
        // 取毫秒
        System.out.println(now.get(ChronoField.MILLI_OF_SECOND));
        // 取微秒
        System.out.println(now.get(ChronoField.MICRO_OF_SECOND));
        // 取纳秒
        System.out.println(now.get(ChronoField.NANO_OF_SECOND));
        // Instant转LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.ofInstant(now, ZoneId.systemDefault());
        // 2019-08-16T09:00:49.324
        System.out.println(localDateTime);
    }

    /**
     * 默认时区对应的年月日,没有时分秒毫秒
     */
    @Test
    public void testLocalDate() {
        LocalDate now = LocalDate.now();
        System.out.println(now.toString());

        now = LocalDate.of(2019, 7, 3);
        // 2019-07-03
        System.out.println(now.toString());

        //日期加上1天
        LocalDate plusDay = now.plusDays(1);
        System.out.println(plusDay.toString());

        //日期加上一周
        LocalDate plusWeek = now.plusWeeks(1);
        System.out.println(plusWeek.toString());

        //计算当年前的第52天是几月几号
        System.out.println("今年的第52天是:" + now.withDayOfYear(52));

        //字符串转日期
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        TemporalAccessor dateTempora = dateTimeFormatter.parse("2018-01-14");
        LocalDate date = LocalDate.from(dateTempora);
        System.out.println(date);

         //格式化日期
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyyMMdd");
        String dateStr = dateTimeFormatter1.format(now);
        System.out.println(dateStr);
    }

    /**
     * 默认时区对应的时分秒毫秒,没有年月日
     */
    @Test
    public void testLocalTime() {
        LocalTime now = LocalTime.now();
        System.out.println(now.toString());

        now = LocalTime.of(23, 10, 10);
        System.out.println(now.toString());

        //时间加上12个小时
        System.out.println("plus 12 hours: " + now.plusHours(12));
    }

    /**
     * 默认时区对应的年月日时分秒毫秒
     */
    @Test
    public void testLocalDateTime() {
        // 获得当前日期时间
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        now = LocalDateTime.of(2019, 7, 3, 9, 10, 10);
        System.out.println(now);

        // 字符串转日期时间
        DateTimeFormatter strToDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        TemporalAccessor dateTemporal = strToDateFormatter.parse("2017-01-01 12:12:13");
        LocalDate date = LocalDate.from(dateTemporal);
        System.out.println(date);

        // 格式化日期时间
        DateTimeFormatter dateToStrFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        String dateStr = dateToStrFormatter.format(now);
        System.out.println(dateStr);
    }

    /**
     * 一段时间,例如:2年、3个月、4天等.
     */
    @Test
    public void testPeriod() {
        LocalDate startDate = LocalDate.now();
        LocalDate endDate = startDate.plusDays(1);

        Period period = Period.between(startDate, endDate);
        System.out.println("间隔的天数" + period.getDays());
        System.out.println("间隔的月数:" + period.getMonths());
        System.out.println("间隔的年数:" + period.getYears());

        // 直接使用LocalDate类中的方法计算日期间隔
        long days = startDate.until(endDate, ChronoUnit.DAYS);
        System.out.println("间隔的天数:" + days);
        long months = startDate.until(endDate, ChronoUnit.MONTHS);
        System.out.println("间隔的月数:" + months);
        long weeks = startDate.until(endDate, ChronoUnit.WEEKS);
        System.out.println("间隔的周数:" + weeks);
    }

    @Test
    public void testDuration() {
        LocalDateTime start = LocalDateTime.now();
        LocalDateTime end = start.plusDays(1);
        Duration duration = Duration.between(start, end);
        System.out.println("间隔的秒数:" + duration.get(ChronoUnit.SECONDS));
        System.out.println("间隔的纳秒数:" + duration.get(ChronoUnit.NANOS));
    }

    @Test
    public void testZonedDateTime() {
        ZonedDateTime zonedDatetime = ZonedDateTime.now();
        ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));

        LocalDateTime localDateTime = LocalDateTime.now();
        ZonedDateTime zonedDatetimeFromZone2 = ZonedDateTime.of(localDateTime, ZoneId.of("America/Los_Angeles"));

        System.out.println("默认时区(即北京)时间:" + zonedDatetime);
        System.out.println("美国洛杉矶时间:" + zonedDatetimeFromZone);
        System.out.println("美国洛杉矶时间:" + zonedDatetimeFromZone2);

        Set<String> allZoneIds = ZoneId.getAvailableZoneIds();
        System.out.println("全球时区集合:" + allZoneIds);
    }

    @Test
    public void testDateToLocalDateTime() {
        Date todayDate = new Date();
        LocalDateTime ldt = Instant.ofEpochMilli(todayDate.getTime())
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
        System.out.println(ldt);

        LocalDateTime localDateTime = LocalDateTime.now();
        // from为Date类1.8起新增的
        Date date = Date.from(localDateTime.atZone( ZoneId.systemDefault()).toInstant());
        System.out.println(date);

        // toInstant为Date类1.8起新增的
        Instant instant = todayDate.toInstant();
    }

    /**
     * java.util.Date to java.time.LocalDate
     */
    @Test
    public void testConvertToLocalDateViaInstant() {
        Date dateToConvert = new Date();

        LocalDate localDate = dateToConvert.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDate();

        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String dateStr = dateTimeFormatter1.format(localDate);
        System.out.println(dateStr);
    }

    /**
     * java.util.Date to java.time.LocalDate
     */
    @Test
    public void testConvertToLocalDateViaMilisecond() {
        Date dateToConvert = new Date();

        LocalDate localDate = Instant.ofEpochMilli(dateToConvert.getTime())
                .atZone(ZoneId.systemDefault())
                .toLocalDate();

        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String dateStr = dateTimeFormatter1.format(localDate);
        System.out.println(dateStr);
    }

    /**
     * java.util.Date to java.time.LocalDate
     */
    @Test
    public void testConvertToLocalDateViaSqlDate() {
        Date dateToConvert = new Date();

        LocalDate localDate = new java.sql.Date(dateToConvert.getTime()).toLocalDate();

        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String dateStr = dateTimeFormatter1.format(localDate);
        System.out.println(dateStr);
    }

    /**
     * java.util.Date to java.time.LocalDateTime
     */
    public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) {
        return dateToConvert.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
    }

    /**
     * java.util.Date to java.time.LocalDateTime
     */
    public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) {
        return Instant.ofEpochMilli(dateToConvert.getTime())
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
    }

    /**
     * java.util.Date to java.time.LocalDateTime
     */
    public LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) {
        return new java.sql.Timestamp(
                dateToConvert.getTime()).toLocalDateTime();
    }

    /**
     * java.time.LocalDate to java.util.Date
     */
    public Date convertToDateViaSqlDate(LocalDate dateToConvert) {
        return java.sql.Date.valueOf(dateToConvert);
    }

    /**
     * java.time.LocalDate to java.util.Date
     */
    public Date convertToDateViaInstant(LocalDate dateToConvert) {
        return java.util.Date.from(dateToConvert.atStartOfDay()
                .atZone(ZoneId.systemDefault())
                .toInstant());
    }

    /**
     * java.time.LocalDateTime to java.util.Date
     */
    public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {
        return java.sql.Timestamp.valueOf(dateToConvert);
    }

    /**
     * java.time.LocalDateTime to java.util.Date
     */
    public Date convertToDateViaInstant(LocalDateTime dateToConvert) {
        return java.util.Date
                .from(dateToConvert.atZone(ZoneId.systemDefault())
                        .toInstant());
    }
    
    /**
     * 返回指定时刻所在周的第一天,基于JDK1.8
     * @param now
     * @return
     */
    public static String firstDayOfWeek(LocalDate now) {
        LocalDate startOfCurrentWeek = now.with(DayOfWeek.MONDAY);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return formatter.format(startOfCurrentWeek);
    }

    /**
     * 返回指定时刻所在周的最后一天,基于JDK1.8
     * @param now
     * @return
     */
    public static String lastDayOfWeek(LocalDate now) {
        LocalDate endOfCurrentWeek = now.with(DayOfWeek.SUNDAY);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return formatter.format(endOfCurrentWeek);
    }
    
    /**
     * 返回指定时刻所在月的最后一天,基于JDK1.8
     * @param now
     * @return
     */
    public static String lastDayOfMonth(LocalDate now) {
        LocalDate lastDayOfMonth = now.with(TemporalAdjusters.lastDayOfMonth());
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return formatter.format(lastDayOfMonth);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17275.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!