开始使用 java8 的日期工具类
例如,现有的类(例如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 的日期工具类的更多相关文章
- 日期工具类 - DateUtil.java
日期工具类,提供对日期的格式化和转换方法.获取区间日期.指定日期.每月最后一天等. 源码如下:(点击下载 -DateUtil.java.commons-lang-2.6.jar ) import ja ...
- JS 日期工具类-基于yDate
源码下载 前言:最近在用到JS日期操作时,发现有一些不方便,于是搜素了一些网上的资料,基于一个开源工具类-yDate 进行了个性化定制,封装成了一个日期工具类工具函数大概介绍:1.普通的日期操作2. ...
- Java日期工具类,Java时间工具类,Java时间格式化
Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...
- JAVA 8 日期工具类
JAVA 8 日期工具类 主题描述 JAVA中日期时间的历史 代码成果 主题描述 JAVA的日期时间一直比较混乱,本来以为joda会是巅峰,但是JAVA 8改变了我的思想.但是即便在JAVA 8面前, ...
- java 日期工具类DateUtils
日期工具类DateUtils CreateTime--2017年5月27日08:48:00Author:Marydon DateUtils.java-对日期类的进一步封装 import java. ...
- java日期工具类DateUtil-续一
上篇文章中,我为大家分享了下DateUtil第一版源码,但就如同文章中所说,我发现了还存在不完善的地方,所以我又做了优化和扩展. 更新日志: 1.修正当字符串日期风格为MM-dd或yyyy-MM时,若 ...
- java日期工具类DateUtil-续二
该版本是一次较大的升级,农历相比公历复杂太多(真佩服古人的智慧),虽然有规律,但涉及到的取舍.近似的感念太多,况且本身的概念就已经很多了,我在网上也是查阅了很多的资料,虽然找到一些计算的方法,但都有些 ...
- java日期工具类DateUtil
一名优秀的程序员,不仅需要有着丰富解决问题的方案,还需要的便是代码的沉淀,这不仅有助于自己快速的开发程序,也有利于保证程序的健壮.那如何才能沉淀自己的”代码“呢?从自己编写util开始其实就是一个不错 ...
- 日期工具类 DateUtils(继承org.apache.commons.lang.time.DateUtils类)
/** * */ package com.dsj.gdbd.utils.web; import org.apache.commons.lang3.time.DateFormatUtils; impor ...
随机推荐
- GoSDK的安装及环境变量配置 入门详解 - 精简归纳
GoSDK的安装及环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 29 转载请注明出处!️ 目录 GoSDK的安装及环境变量配置 入门详解 - 精简归纳 一.进入G ...
- Luogu P3757 [CQOI2017]老C的键盘
题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...
- 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 ...
- Hash 哈希(上)
Hash 哈希(上) 目录 Hash 哈希(上) 简介 Hash函数的构造 取余法 乘积取整法 其他方法 冲突的处理 挂链法 开放定址法 线性探查法 二次探查法 双哈希法 结语 简介 Hash,又称散 ...
- 2018noip游记
2018noip游记 相隔一年多才想起可以弄一篇博客纪念一下我的首次比赛, 以现在的水平回望过去,发现很好玩很有纪念意义, 于是这篇博客诞生了 \(T1\) 当时的我刚学会什么是字符串,但仍然很不熟练 ...
- 排序算法—快速排序(Quick Sort)
快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...
- H5--自动刷新
每30秒中刷新当前html页面: <meta http-equiv="refresh" content="30">
- Git Push大文件报错后如何撤回
昨晚在提交一个项目代码时,不小心把数据库备份文件也一起Commit了:到最后Push的时候报错了.最后弄了半天解决了,在此记录下. 如下图,文件有108M. 项目放在第三方托管平台上,根据提示查看了原 ...
- [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥
之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...
- CSS动画animation
transition: 过渡动画transition-property: 属性transition-duration: 间隔transition-timing-function: 曲线transiti ...