Java 1.8 日期时间小记

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);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值