没长正的技术专栏 勤动手、多思考

Java 时间

2013-08-02

阅读:

Java  IO
2021-10-08

Java 时间

LocalDateTime

0.时间比较

//isBefore
//isAfter 
//截取部分代码片段
LocalDateTime.parse(tmp.get("ts").toString(), DATE_TIME_FORMATTER).isAfter(LocalDateTime.now().minusMinutes(config.getIncTime()))
    
    
// 获取时间戳
System.currentTimeMillis()
// 时间戳
LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli()

1. 时间格式枚举类

public enum TimeFormat {
        // 短时间格式 年月日
        /**
         * 时间格式:yyyy-MM-dd
         */
        SHORT_DATE_PATTERN_LINE("yyyy-MM-dd"),
        /**
         * 时间格式:yyyy/MM/dd
         */
        SHORT_DATE_PATTERN_SLASH("yyyy/MM/dd"),
        /**
         * 时间格式:yyyy\\MM\\dd
         */
        SHORT_DATE_PATTERN_DOUBLE_SLASH("yyyy\\MM\\dd"),
        /**
         * 时间格式:yyyyMMdd
         */
        SHORT_DATE_PATTERN_NONE("yyyyMMdd"),

        // 长时间格式 年月日时分秒
        /**
         * 时间格式:yyyy-MM-dd HH:mm:ss
         */
        LONG_DATE_PATTERN_LINE("yyyy-MM-dd HH:mm:ss"),

        /**
         * 时间格式:yyyy/MM/dd HH:mm:ss
         */
        LONG_DATE_PATTERN_SLASH("yyyy/MM/dd HH:mm:ss"),
        /**
         * 时间格式:yyyy\\MM\\dd HH:mm:ss
         */
        LONG_DATE_PATTERN_DOUBLE_SLASH("yyyy\\MM\\dd HH:mm:ss"),
        /**
         * 时间格式:yyyyMMdd HH:mm:ss
         */
        LONG_DATE_PATTERN_NONE("yyyyMMdd HH:mm:ss"),

        // 长时间格式 年月日时分秒 带毫秒
        LONG_DATE_PATTERN_WITH_MILSEC_LINE("yyyy-MM-dd HH:mm:ss.SSS"),

        LONG_DATE_PATTERN_WITH_MILSEC_SLASH("yyyy/MM/dd HH:mm:ss.SSS"),

        LONG_DATE_PATTERN_WITH_MILSEC_DOUBLE_SLASH("yyyy\\MM\\dd HH:mm:ss.SSS"),

        LONG_DATE_PATTERN_WITH_MILSEC_NONE("yyyyMMdd HH:mm:ss.SSS");

        private transient DateTimeFormatter formatter;

        TimeFormat(String pattern) {
            formatter = DateTimeFormatter.ofPattern(pattern);
        }
    }

2. 日期转换

// Obtains an instance of Date from an Instant object.
	public static Date from(
			Instant instant) {
		try {
			return new Date(instant.toEpochMilli());
		} catch (ArithmeticException ex) {
			throw new IllegalArgumentException(ex);
		}
	}

	// Converts this Date object to an Instant.
	public Instant toInstant() {
		return Instant.ofEpochMilli(getTime());
	}

	/**
	 * 测试方法
	 *
	 * @return
	 */
	public Long getTime() {
		return 1111111111111L;
	}

	// 这两个方法使我们可以方便的实现将旧的日期类转换为新的日期类,具体思路都是通过Instant当中介,然后通过Instant来创建LocalDateTime(这个类可以很容易获取LocalDate和LocalTime),新的日期类转旧的也是如此,将新的先转成LocalDateTime,然后获取Instant,接着转成Date,具体实现细节如下:

	// 01. Date --> java.time.LocalDateTime
	public static void UDateToLocalDateTime() {
		Date date = new Date();
		System.out.println("start :" + date);
		Instant instant = date.toInstant();
		ZoneId zone = ZoneId.systemDefault();
		LocalDateTime tmp = LocalDateTime.ofInstant(instant, zone);

		System.out.println("end :" + tmp);
	}

	// 02. Date --> java.time.LocalDate
	public static void UDateToLocalDate() {
		Date date = new Date();
		Instant instant = date.toInstant();
		ZoneId zone = ZoneId.systemDefault();
		LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
		localDateTime.toLocalDate();
	}

	// 03. Date --> java.time.LocalTime
	public static void UDateToLocalTime() {
		Date date = new Date();
		Instant instant = date.toInstant();
		ZoneId zone = ZoneId.systemDefault();
		LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
		localDateTime.toLocalTime();
	}

	// 04. java.time.LocalDateTime --> Date
	public static void LocalDateTimeToUdate() {
		LocalDateTime localDateTime = LocalDateTime.now();
		ZoneId zone = ZoneId.systemDefault();
		Instant instant = localDateTime.atZone(zone).toInstant();
		Date date = Date.from(instant);

		System.out.println(date);
	}

	// 05. java.time.LocalDate --> Date
	public static void LocalDateToUdate() {
		LocalDate localDate = LocalDate.now();
		ZoneId zone = ZoneId.systemDefault();
		Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
		Date.from(instant);
	}

	// 06. java.time.LocalTime --> Date
	public static void LocalTimeToUdate() {
		LocalTime localTime = LocalTime.now();
		LocalDate localDate = LocalDate.now();
		LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
		ZoneId zone = ZoneId.systemDefault();
		Instant instant = localDateTime.atZone(zone).toInstant();
		Date.from(instant);
	}

3. 计算时间差值

/**
     * 通过Period 计算时间差,返回相差年月日
     */
    public static void periodTest() {

        LocalDate today = LocalDate.now();
        System.out.println("Today : " + today);
        LocalDate birthDate = LocalDate.of(1993, Month.OCTOBER, 19);
        System.out.println("BirthDate : " + birthDate);

        Period p = Period.between(birthDate, today);
        System.out.printf("年龄 : %d 年 %d 月 %d 日", p.getYears(), p.getMonths(), p.getDays());
        System.out.println();

        /**
         * Today : 2017-06-30
         *
         * BirthDate : 1993-10-19
         *
         * 年龄 : 23 年 8 月 11 日
         *
         */
    }

    /**
     * 通过Duration 计算时间查
     */
    public static void durationTest() {

        Instant inst1 = Instant.now();
        System.out.println("Inst1 : " + inst1);

        LocalDate.of(1993, Month.OCTOBER, 19);

        Instant inst2 = inst1.plus(Duration.ofSeconds(1000));
        System.out.println("Inst2 : " + inst2);

        System.out.println("Difference in milliseconds : " + Duration.between(inst1, inst2).toMillis());

        System.out.println("Difference in seconds : " + Duration.between(inst1, inst2).getSeconds());

        System.out.println("Difference in minutes : " + Duration.between(inst1, inst2).getSeconds() / 60);

    }

    /**
     * ChronoUnit类可用于在单个时间单位内测量一段时间,例如天数或秒。
     * <p>
     * 以下是使用between()方法来查找两个日期之间的区别的示例。
     */
    public static void chronoUnitTest() {

        LocalDate startDate = LocalDate.of(1993, Month.OCTOBER, 19);
        System.out.println("开始时间  : " + startDate);

        LocalDate endDate = LocalDate.of(2017, Month.JUNE, 16);
        System.out.println("结束时间 : " + endDate);

        // long hoursDiff = ChronoUnit.HOURS.between(startDate, endDate);
        // //不能显示小时
        // System.out.println("两时间的差在小时数 : " + hoursDiff);

        long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
        System.out.println("两时间的差在天数   : " + daysDiff);
        long monthDiff = ChronoUnit.MONTHS.between(startDate, endDate);
        System.out.println("两时间的差在月数   : " + monthDiff);
        long yearDiff = ChronoUnit.YEARS.between(startDate, endDate);
        System.out.println("两时间的差在年数   : " + yearDiff);

        /**
         * 开始时间 : 1993-10-19         
         * 结束时间 : 2017-06-16         
         * 两天之间的差在天数 : 8641
         *
         */
        Long minuteDiff = ChronoUnit.MINUTES.between(LocalDateTime.now(),
                LocalDateTime.now().plusHours(2).plusMinutes(31).plusSeconds(20));
        System.out.println("当前时间相差的分钟数时:---->" + minuteDiff);
    }

    /**
     * ChronoUnit类可用于在单个时间单位内测量一段时间,例如天数或秒。
     * <p>
     * 以下是使用between()方法来查找两个日期之间的区别的示例。
     */
    public static void chronoUnitTest2() {
        LocalDateTime startDate = LocalDateTime.of(1993, Month.OCTOBER, 19, 1, 2);
        System.out.println("开始时间  : " + startDate);
        LocalDateTime endDate = LocalDateTime.of(2017, Month.JUNE, 16, 0, 4);
        System.out.println("结束时间 : " + endDate);

        // long hoursDiff = ChronoUnit.HOURS.between(startDate, endDate);
        // //不能显示小时
        // System.out.println("两时间的差在小时数 : " + hoursDiff);

        long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
        System.out.println("两时间的差在天数   : " + daysDiff);
        long monthDiff = ChronoUnit.MONTHS.between(endDate, startDate);
        System.out.println("两时间的差在月数   : " + monthDiff);
        long yearDiff = ChronoUnit.YEARS.between(startDate, endDate);
        System.out.println("两时间的差在年数   : " + yearDiff);

        /**
         * 开始时间 : 1993-10-19
         *
         * 结束时间 : 2017-06-16
         *
         * 两天之间的差在天数 : 8641
         *
         */
    }

    public static void getWeek() {
        LocalDateTime now = LocalDateTime.now();
        int num = now.getDayOfYear();
        System.out.println("一年的多少天:" + num);
    }


欢迎拍砖,多多交流,转载请注明出处:[没长正的技术专栏](http://blog.meizhangzheng.com) 如涉及侵权问题,请发送邮件到xsj34567@163.com,如情况属实本人将会尽快删除。


上一篇 Java SPI

下一篇 Java Netty

Comments

Content