例如,现有的类(例如java.util.Date和SimpleDateFormatter)不是线程安全的,这会导致用户潜在的并发问题。而新的LocalDate、LocalDateTime、DateTimeFormatter是不可变值类。

LocalDate和LocalTime。它们是本地的,它们从观察者的角度表示日期和时间,例如书桌上的日历或墙上的时钟。还有一种称为复合类LocalDateTime,这是一个配对LocalDate和LocalTime。

下面是一个简单的思维导图和一个基于LocalDate、LocalDateTime...实现的日期工具类可以帮助我们记住一些类、API...,日期工具类中引入了gvava工具包。maven依赖如下

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.1-jre</version>
</dependency>
import com.google.common.base.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Timestamp;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.*;
import java.util.*;

public class Date8Util {
private static final Logger logger = LoggerFactory.getLogger(Date8Util.class);
public static final HashMap<String,String> fomatMap = new HashMap();
static {
fomatMap.put("DATE_FORMAT_DEFAULT","yyyy-MM-dd HH:mm:ss");
fomatMap.put("FORMATE1","yyyy-MM-dd hh:mm:ss");
fomatMap.put("DATE_FORMAT_YYYYMMDD","yyyy-MM-dd");
fomatMap.put("DATE_FORMAT_YYYYMMDDHHSSMS","yyyyMMddHHmmssms");
fomatMap.put("DATE_FORMAT_YYYYMMDDHHSS","yyyyMMddHHmmss");
fomatMap.put("DATE_FORMAT_YYYY_MM_DD","yyyyMMdd");
fomatMap.put("DATE_FORMAT_YYYY_MM","yyyyMM");
fomatMap.put("DATE_FORMAT_HHmmss","HHmmss");
fomatMap.put("DATE_FORMAT_JQUERY_DATEPICKER_DEFAULT","yyyy/MM/dd");
fomatMap.put("FORMATE_PATTERN_C_YYYYMMDD","yyyy年MM月dd日");
fomatMap.put("FORMATE_PATTERN_C_MMDD","MM月dd日");
fomatMap.put("FORMATE_PATTERN_C_YYYYMM","yyyy年MM月");
}
/**
* 获取当前日期时间 yyyy-MM-dd HH:mm:ss
* @return
*/
public static String getTime(){
LocalDateTime date = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(fomatMap.get("DATE_FORMAT_DEFAULT"), Locale.CHINA);
return date.format(dtf);
}

/**
* 当前日期 字符串日期格式
* @return Date
*/
public static Date getNowDate(){
return Timestamp.valueOf(getTime());
}

/**
* 当前日期.yyyy-MM-dd
* @return
*/
public static String getCurrentDate(){
return LocalDate.now().format(DateTimeFormatter.ofPattern(fomatMap.get("DATE_FORMAT_YYYYMMDD"), Locale.CHINA));
}

/**
* @Description 当前日期时间 yyyyMMddHHmmssms
* @return
*/
public static String getCurrDate(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(fomatMap.get("DATE_FORMAT_YYYYMMDDHHSSMS"), Locale.CHINA));
}
public static String getNowDate(String fomat){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(fomat,Locale.CHINA));
}

/**
* 字符串转日期
* @param aMask
* @param aDate
* @return
*/
public static String convertDateToString(String aMask, Date aDate){
//Date 转化位 LocalDateTime
LocalDateTime dateTime = LocalDateTime.ofInstant(aDate.toInstant(),ZoneId.systemDefault());
return getDateTime(aMask, dateTime);
}
public static String convertDateToString(String aMask, LocalDateTime dateTime){
return getDateTime(aMask, dateTime);
}

/**
* 获取date time
* @param fmt
* @param dateTime
* @return
*/
private static String getDateTime(String fmt, LocalDateTime dateTime) {
DateTimeFormatter dtf = null;
String str = "";
if(dateTime != null){
dtf = DateTimeFormatter.ofPattern(fmt,Locale.CHINA);
str = dateTime.format(dtf);
}
return str;
}

/**
* 日期字符串转 日期
* @param fmt
* @param dateStr
* @return
*/
public static LocalDate convertStringToDate(String fmt,String dateStr){
if (Strings.isNullOrEmpty(fmt) || Strings.isNullOrEmpty(dateStr)) {
return null;
} else {
DateTimeFormatter sdf = DateTimeFormatter.ofPattern(fmt,Locale.CHINA);
try {
return LocalDate.parse(dateStr,sdf);
} catch (DateTimeParseException var4) {
logger.error("ParseException[" + fmt + "] for:" + dateStr, var4);
return null;
}
}
}

/**
* 获取 日期所在月份的第一天 date为空传当前月
* @param date
* @return
*/
public static LocalDate getFirstDayOfMonth(LocalDate date){
return Optional.ofNullable(date).map(dt -> dt.with(TemporalAdjusters.firstDayOfMonth())).orElse(null);
}
/**
* 获取 日期所在月份的最后一天,date为空传当前月
* @param date
* @return
*/
public static LocalDate getLastDayOfMonth(LocalDate date){
return Optional.ofNullable(date).map(dt -> dt.with(TemporalAdjusters.lastDayOfMonth())).orElse(null);
}

/**
* 获取上一个月的这个时候,例如当前日期2002-09-11,则返回2020-08-11
* @param date
* @return
*/
public static LocalDate getMonthOfMonth(LocalDate date){
return Optional.ofNullable(date).map(dt -> dt.minusMonths(1)).orElse(null);
}

/**
* 获取系统日期时间
* @return
*/
public static LocalDateTime getSystemTime(){
return LocalDateTime.ofInstant(Instant.now(),ZoneId.systemDefault());
}

/**
* 日期时间 转字符串
* @param dateTime
* @param pattern
* @return
*/
public static String dateTimeToString(LocalDateTime dateTime, String pattern){
if(dateTime == null || Strings.isNullOrEmpty(pattern)){
return null;
}
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern,Locale.CHINA);
return dateTime.format(dtf);
}

/**
* 两个日期相隔的天数
* @param startdate
* @param endDate
* @return
*/
public static int daysOfTwo(LocalDate startdate, LocalDate endDate){
return (int) startdate.until(endDate, ChronoUnit.DAYS);
}
public static int daysOfTwo(String startdate, String endDate, String dateFormat){
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateFormat,Locale.CHINA);
LocalDate smDate = LocalDate.parse(startdate,dtf);
LocalDate bDate = LocalDate.parse(endDate,dtf);
return (int)smDate.until(bDate,ChronoUnit.DAYS);
}

/**
* 昨天日期
* @return
*/
public static String getYesterday(){
LocalDate now = LocalDate.now();
return now.minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd",Locale.CHINA));
}

/**
* 比较日期大小
* @param date1
* @param date2
* @return
*/
public static int compare(String date1, String date2){
DateTimeFormatter dtf = null;
if(date1.indexOf(":") > -1 && date2.indexOf(":") > -1){
dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss",Locale.CHINA);
LocalDateTime dateTime1 = LocalDateTime.parse(date1,dtf);
LocalDateTime dateTime2 = LocalDateTime.parse(date2,dtf);
if(dateTime1.isBefore(dateTime2)){
return -1;
}
return dateTime1.isAfter(dateTime2) ? 1:0;
}else{
dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd",Locale.CHINA);
LocalDate dt1 = LocalDate.parse(date1,dtf);
LocalDate dt2 = LocalDate.parse(date2,dtf);
if(dt1.isBefore(dt2)){
return -1;
}
return dt1.isAfter(dt2) ? 1:0;
}
}

/**
* 获取日期 x年x月x日
* @param date
* @return
*/
public static String getFormatDate(String date){
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse(date,dtf2);
return localDate.format(dtf);
}

/**
* data1 是否 大于date2
* @param date1
* @param date2
* @param format
* @return
*/
public static boolean date1DYdate2NY(String date1, String date2, String format){
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format,Locale.CHINA);
LocalDate dt1 = LocalDate.parse(date1,dtf);
LocalDate dt2 = LocalDate.parse(date2,dtf);
return dt1.isAfter(dt2);
}

public static String getTimeYYYYMMDD() {
DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyyMMdd",Locale.CHINA);
return LocalDate.now().format(sdf);
}

public static String getTimeHHmmss() {
DateTimeFormatter sdf = DateTimeFormatter.ofPattern("HHmmss",Locale.CHINA);
return LocalTime.now().format(sdf);
}

public static String getTimeHHmmss000() {
DateTimeFormatter sdf = DateTimeFormatter.ofPattern("HHmmss000",Locale.CHINA);
return LocalTime.now().format(sdf);
}
public static LocalDateTime changeMonth(LocalDateTime date, int i) {
return date.minusMonths(i);
}

public static String changeMonth(int month, String format) {
LocalDateTime dateTime = changeMonth(LocalDateTime.now(),month);
return dateToString(getFirstDayOfMonth(dateTime.toLocalDate()), format);
}

private static String dateToString(LocalDate date, String format) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format,Locale.CHINA);
return date.format(dtf);
}

/**
* 获取上年第一天
* @param format
* @param year
* @return
*/
public static String getFirstDayOfPastYear(String format, int year) {
LocalDateTime dateTime = LocalDateTime.now().minusYears(year);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format,Locale.CHINA);
String sdate = dateTime.with(TemporalAdjusters.firstDayOfYear()).format(dtf) ;
return sdate;
}

public static String getFirstDayOfLastYear(String format) {
return getFirstDayOfPastYear(format, 1);
}

/**
* 获取上x年的的最后一天
* @param format
* @param year
* @return
*/
public static String getLastDayOfPastYear(String format, int year) {
LocalDateTime dateTime = LocalDateTime.now().minusYears(year);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format,Locale.CHINA);
String sdate = dateTime.with(TemporalAdjusters.lastDayOfYear()).format(dtf) ;
return sdate;
}

/**
* 获取上1年的的最后一天
* @param format
* @return
*/
public static String getLastDayOfLastYear(String format) {
return getLastDayOfPastYear(format, 1);
}

/**
* 当前月 + month 的第一天
* @param month
* @return
*/
public static String getFirstDayOfMonth(int month) {
LocalDate localDate = LocalDate.now().minusMonths(-month);
LocalDate day = localDate.with(TemporalAdjusters.firstDayOfMonth());
return dateToString(getFirstDayOfMonth(day), "yyyy-MM-dd");
}
/**
* 当前年+year , 月 + month 的第一天
* @param month
* @return
*/
public static String getFirstDayOfMonth(int month, int year) {
LocalDate localDate = LocalDate.now().minusYears(-year).minusMonths(-month);
LocalDate day = localDate.with(TemporalAdjusters.firstDayOfMonth());
return dateToString(getFirstDayOfMonth(day), "yyyy-MM-dd");
}
public static boolean isMonthEnd(LocalDate date){
LocalDate day = date.with(TemporalAdjusters.lastDayOfMonth());
if(date.equals(day)){
return true;
}
return false;
}
public static boolean isFirstDayOfMonth(String date){
LocalDate dt = convertStringToDate("yyyy-MM-dd",date);
return Strings.isNullOrEmpty(date) ? false : dt.equals(dt.with(TemporalAdjusters.firstDayOfMonth()));
}
public static LocalDate getFirstDayOfWeek(LocalDate date){
TemporalField fieldISO = WeekFields.ISO.dayOfWeek();
return date.with(fieldISO,1);
}
}

开始使用 java8 的日期工具类的更多相关文章

  1. 日期工具类 - DateUtil.java

    日期工具类,提供对日期的格式化和转换方法.获取区间日期.指定日期.每月最后一天等. 源码如下:(点击下载 -DateUtil.java.commons-lang-2.6.jar ) import ja ...

  2. JS 日期工具类-基于yDate

    源码下载 前言:最近在用到JS日期操作时,发现有一些不方便,于是搜素了一些网上的资料,基于一个开源工具类-yDate 进行了个性化定制,封装成了一个日期工具类工具函数大概介绍:1.普通的日期操作2. ...

  3. Java日期工具类,Java时间工具类,Java时间格式化

    Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...

  4. JAVA 8 日期工具类

    JAVA 8 日期工具类 主题描述 JAVA中日期时间的历史 代码成果 主题描述 JAVA的日期时间一直比较混乱,本来以为joda会是巅峰,但是JAVA 8改变了我的思想.但是即便在JAVA 8面前, ...

  5. java 日期工具类DateUtils

      日期工具类DateUtils CreateTime--2017年5月27日08:48:00Author:Marydon DateUtils.java-对日期类的进一步封装 import java. ...

  6. java日期工具类DateUtil-续一

    上篇文章中,我为大家分享了下DateUtil第一版源码,但就如同文章中所说,我发现了还存在不完善的地方,所以我又做了优化和扩展. 更新日志: 1.修正当字符串日期风格为MM-dd或yyyy-MM时,若 ...

  7. java日期工具类DateUtil-续二

    该版本是一次较大的升级,农历相比公历复杂太多(真佩服古人的智慧),虽然有规律,但涉及到的取舍.近似的感念太多,况且本身的概念就已经很多了,我在网上也是查阅了很多的资料,虽然找到一些计算的方法,但都有些 ...

  8. java日期工具类DateUtil

    一名优秀的程序员,不仅需要有着丰富解决问题的方案,还需要的便是代码的沉淀,这不仅有助于自己快速的开发程序,也有利于保证程序的健壮.那如何才能沉淀自己的”代码“呢?从自己编写util开始其实就是一个不错 ...

  9. 日期工具类 DateUtils(继承org.apache.commons.lang.time.DateUtils类)

    /** * */ package com.dsj.gdbd.utils.web; import org.apache.commons.lang3.time.DateFormatUtils; impor ...

随机推荐

  1. GoSDK的安装及环境变量配置 入门详解 - 精简归纳

    GoSDK的安装及环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 29 转载请注明出处!️ 目录 GoSDK的安装及环境变量配置 入门详解 - 精简归纳 一.进入G ...

  2. Luogu P3757 [CQOI2017]老C的键盘

    题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...

  3. RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation

    问题 在用pytorch跑生成对抗网络的时候,出现错误Runtime Error: one of the variables needed for gradient computation has b ...

  4. Hash 哈希(上)

    Hash 哈希(上) 目录 Hash 哈希(上) 简介 Hash函数的构造 取余法 乘积取整法 其他方法 冲突的处理 挂链法 开放定址法 线性探查法 二次探查法 双哈希法 结语 简介 Hash,又称散 ...

  5. 2018noip游记

    2018noip游记 相隔一年多才想起可以弄一篇博客纪念一下我的首次比赛, 以现在的水平回望过去,发现很好玩很有纪念意义, 于是这篇博客诞生了 \(T1\) 当时的我刚学会什么是字符串,但仍然很不熟练 ...

  6. 排序算法—快速排序(Quick Sort)

    快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...

  7. H5--自动刷新

    每30秒中刷新当前html页面: <meta http-equiv="refresh" content="30">

  8. Git Push大文件报错后如何撤回

    昨晚在提交一个项目代码时,不小心把数据库备份文件也一起Commit了:到最后Push的时候报错了.最后弄了半天解决了,在此记录下. 如下图,文件有108M. 项目放在第三方托管平台上,根据提示查看了原 ...

  9. [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥

    之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...

  10. CSS动画animation

    transition: 过渡动画transition-property: 属性transition-duration: 间隔transition-timing-function: 曲线transiti ...