package com.effective.common.base.date;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * 日期工具类
 * @author yanweiqi
 * @since 2016-5-6
 *
 */
public class LocalDateUtils {

	private static ZoneId zone = ZoneId.systemDefault();

	/**
	 * 字符串转Date
	 * @param date
	 * @return
	 * @throws Exception
	 */
	public static Date convertToDate(String date) throws Exception{
		LocalDate localDate = null;
		if(null == date){
			throw new NullPointerException("date isn't null");
		} else {
			localDate = LocalDate.parse(date);
            return convertToDate(localDate);
		}
	}

	/**
	 * 字符串转LocalDateTime
	 * @param date
	 * @return localDateTime
	 */
	public static LocalDateTime convertToLocalDateTime(String date){
		LocalDateTime localDateTime = null;
		if(null == date){
			throw new NullPointerException("date isn't null");
		} else {
			localDateTime = LocalDateTime.parse(date);
            return localDateTime;
		}
	}

	/**
	 * LocalDate转Date
	 * @param localDate
	 * @return Date
	 */
	public static Date convertToDate(LocalDate localDate){
		Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
		return Date.from(instant);
	}

	/**
	 * LocalDate转Date
	 * @param localDateTime
	 * @return Date
	 */
	public static Date convertToDate(LocalDateTime localDateTime){
		Instant instant = localDateTime.atZone(zone).toInstant();
		return Date.from(instant);
	}

	/**
	 * Date转LocalDate
	 * @param date
	 * @return localDate
	 */
	public static LocalDate convertToLocalDate(Date date){
		Instant instant = date.toInstant();
		return convertToLocalDateTime(instant).toLocalDate();
	}

	/**
	 * Date转LocalTime
	 * @param date
	 * @return localDate
	 */
	public static LocalTime convertToLocalTime(Date date){
		Instant instant = date.toInstant();
		return convertToLocalDateTime(instant).toLocalTime();
	}

	/**
	 * Date转LocalDatetime
	 * @param date
	 * @return localDate
	 */
	public static LocalDateTime convertToLocalDateTime(Date date){
		Instant instant = date.toInstant();
		return convertToLocalDateTime(instant);
	}

	/**
	 * Instant转LocalDateTime
	 * @param instant
	 * @return
	 */
	public static LocalDateTime convertToLocalDateTime(Instant instant){
		return LocalDateTime.ofInstant(instant, zone);
	}

	/**
	 * LocalDateTime转Instant
	 * @param localDateTime
	 * @return
	 */
	public static Instant convertToInstant(LocalDateTime localDateTime){
		return localDateTime.atZone(zone).toInstant();
	}

	/**
	 * LocalDate转Instant
	 * @param localDate
	 * @return
	 */
	public static Instant convertToInstant(LocalDate localDate){
		return localDate.atStartOfDay(zone).toInstant();
	}

	/**
	 * LocalDate转LocalDateTime
	 * @param localDate
	 * @return LocalDateTime
	 */
	public static LocalDateTime convertToLocalDateTime(LocalDate localDate){
		return localDate.atStartOfDay();
	}

	/**
	 * 日周期格式化
	 * @param localDateTime
	 * @param formatStyle
	 * @return
	 */
	public static String formatter(LocalDateTime localDateTime, String formatStyle){
		return DateTimeFormatter.ofPattern(formatStyle).format(localDateTime);
	}

    /**
     * 设置年
     * @param sourceDate
     * @param year
     * @return LocalDateTime
     */
	public static LocalDateTime setYear(LocalDateTime sourceDate, Integer year){
		return sourceDate.withYear(year);
	}

    /**
     * 设置月
     * @param sourceDate
     * @param month
     * @return LocalDateTime
     */
	public static LocalDateTime setMonth(LocalDateTime sourceDate, Integer month){
		return sourceDate.withMonth(month);
	}

    /**
     * 设置天
     * @param sourceDate
     * @param month
     * @return LocalDateTime
     */
	public static LocalDateTime setDayOfMonth(LocalDateTime sourceDate, Integer dayOfMonth){
		return sourceDate.withDayOfMonth(dayOfMonth);
	}

	/**
	 * 设置小时
	 * @param sourceDate
	 * @param hour
	 * @return
	 */
	public static LocalDateTime setHour(LocalDateTime sourceDate,Integer hour){
		return sourceDate.withHour(hour);

	}

	/**
	 * 设置分钟
	 * @param sourceDate
	 * @param minute
	 * @return
	 */
	public static LocalDateTime setMinute(LocalDateTime sourceDate,Integer minute){
		return sourceDate.withMinute(minute);
	}

	/**
	 * 设置秒
	 * @param sourceDate
	 * @param second
	 * @return
	 */
	public static LocalDateTime setSecond(LocalDateTime sourceDate,Integer second){
		return sourceDate.withSecond(second);
	}

	/**
	 * 修改年月日
	 * @param sourceDate
	 * @param year
	 * @param month
	 * @param dayOfMonth
	 * @return
	 */
    public static LocalDateTime setYMD(LocalDateTime sourceDate, Integer year, Integer month, Integer dayOfMonth) {
		return sourceDate.withYear(year).withMonth(month).withDayOfMonth(dayOfMonth);
    }

    /**
     * 修改时分秒
     * @param sourceDate
     * @param hour
     * @param minute
     * @param second
     * @return
     */
    public static LocalDateTime setHMS(LocalDateTime sourceDate,Integer hour, Integer minute, Integer second) {
		return sourceDate.withHour(hour).withMinute(minute).withSecond(second);
    }

    /**
     * 计算相差的天数
     * @param beginDate
     * @param endDate
     * @return
     */
    public static int getInteverDays(LocalDate beginDate,LocalDate endDate){
    	Period period = Period.between(beginDate, endDate);
    	return period.getDays();
    }

    /**
     * 日期加减
     * @param  num  数量
     * @param  unit  单位
     * @param  LocalDate 原日期
     * @return LocalDate 增加后的日期
     */
	@SuppressWarnings("static-access")
	public static LocalDate addLocalDate(long num,ChronoUnit unit,final LocalDate localDate){
    	LocalDate resultDate;
    	if(num > 0){
    		resultDate = localDate.now().plus(num, unit);
    	} else {
    		resultDate = localDate.now().minus(Math.abs(num), unit);
    	}
    	return resultDate;
    }

    /**
     * 日期时分秒加
     * @param  num  数量
     * @param  unit 单位
     * @param  localDateTime 原日期
     * @return LocalDateTime 增加后的日期
     */
    @SuppressWarnings("static-access")
	public static LocalDateTime addLocalDateTime(long num,ChronoUnit unit,LocalDateTime localDateTime){
    	LocalDateTime resultDateTime;
    	if(num > 0){
    		resultDateTime = localDateTime.now().plus(num, unit);
    	} else {
    		resultDateTime = localDateTime.now().minus(Math.abs(num),unit);
    	}
    	return resultDateTime;
    }

    /**
     * 时分秒加减
     * @param  num  数量
     * @param  unit 单位
     * @param  localTime 原日期
     * @return LocalDateTime 增加后的日期
     */
    @SuppressWarnings("static-access")
	public static LocalTime addLocalTime(long num,ChronoUnit unit,LocalTime localTime){
    	LocalTime resultTime;
    	if(num > 0){
    		resultTime = localTime.now().plus(num, unit);
    	} else {
    		resultTime = localTime.now().minus(Math.abs(num), unit);
    	}
    	return resultTime;
    }

    public static void main(String[] args){

    	LocalDateTime time  = LocalDateTime.now();
    	String rr = formatter(time, "yyyy-MM-dd HH:mm:ss");
    	System.out.println(rr);
    	LocalDateTime time2  = addLocalDateTime(-2, ChronoUnit.HOURS, time);
    	String yy = formatter(time2, "yyyy-MM-dd HH:mm:ss");
    	System.out.println(yy);
    }

Java8新特性之一、时间日期API的更多相关文章

  1. java8新特性七-Date Time API

    Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: 非线程安全 − java.ut ...

  2. Java8新特性之三:Stream API

    Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...

  3. Java8新特性时间日期库DateTime API及示例

    Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...

  4. Java8 新特性 Data Time API

    Java8新的日期类型 在Java8以前,Date日期API对我们非常的不友好,它无法表示日期,只能以毫秒的精试来表示时间,并且可以修改,他的线程还不是安全的.所以Java8中引入了全新的日期和时间A ...

  5. 2020你还不会Java8新特性?

    Java8(1)新特性介绍及Lambda表达式 前言: 跟大娃一块看,把原来的电脑拿出来放中间看视频用 --- 以后会有的课程 难度 深入Java 8 难度1 并发与netty 难度3 JVM 难度4 ...

  6. java8新特性——时间日期API

    传统的时间 API 存在线程安全的问题,在多线程开发中必须要上锁,所以 java8 现在为我们提供了一套全新的时间日期 API ,今天进来学习一下java8 的时间日期 API. 一.使用 Local ...

  7. Java8新特性(三)——Optional类、接口方法与新时间日期API

    一.Optional容器类 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. 查看结构图可以看到有如下常用方法: of(T)—— ...

  8. Java8新特性——新一套时间API的使用

    JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了.而Calendar并不比Date好多少.它们面临的问题是: 可变性: ...

  9. Java8 新特性(三) - 日期时间对象以及一些其他特性

    日期时间对象 关于日期时间的操作可以分为两种: 转换:与字符串的互相转换,与时间戳的互相转换 计算:计算两个时间点之间的间隔.时间点与时间段的计算(计算下周N.下个月D日.去年M月D日等等) Java ...

  10. 乐字节-Java8新特性之Date API

    上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...

随机推荐

  1. CF467C George and Job (DP)

    Codeforces Round #267 (Div. 2) C. George and Job time limit per test 1 second memory limit per test ...

  2. (JS实现顾客商品浏览记录以及购物车)Cookie的保存与删除

    //JS实现顾客浏览商品的记录以及实现购物车的功能function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.s ...

  3. 陈正冲老师讲c语言之声明和定义的区别

    什么是定义?什么是声明?它们有何区别? 举个例子: A)int i; B)extern int i;(关于extern,后面解释) 哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎 ...

  4. HDU 2517 棋盘分割

    题意:n刀切割棋盘 下面是8*8的棋盘,每个数字代表棋盘对应点的权值,问切割n刀后,每一块的和  的均方差最小是多少 均方差的公式需要先化简: 由上式得,均方差最小 显然是要 Xi^2 最小 d[k] ...

  5. commands - `for`

    internal variable of separator: IFS

  6. ubuntu的/etc/modules内核模块文件

    /etc/modules: 内核模块文件,里面列出的模块会在系统启动时自动加载. /etc/modprobe.d: 存放禁止加载或者加载内核模块脚本的目录. 以下是我增加netfilter模块是的流程 ...

  7. 【解高次同余方程】51nod1038 X^A Mod P

    1038 X^A Mod P 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 X^A mod P = B,其中P为质数.给出P和A B,求< P的所有X. 例如:P = 11 ...

  8. leetcode — palindrome-partitioning

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  9. Java实现一个双向链表的倒置功能

    题目要求:Java实现一个双向链表的倒置功能(1->2->3 变成 3->2->1) 提交:代码.测试用例,希望可以写成一个Java小项目,可以看到单元测试部分 该题目的代码, ...

  10. Python 3 运行 shell 命令

    #python 3.5 , win10 引入包 #os.chdir('path') import osimport subprocess #https://docs.python.org/3.5/li ...