开始使用 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 ...
随机推荐
- 腾讯云服务器简单配置web项目
如图:目前域名备案工作完成,需要将主页展示出来, 域名解析就不讲了,超级简单, 如果不理解可以加群交流,这里主要讲一下通过Apache 开启服务(80端口)对项目进行展示 1. 首先安装Apache ...
- angular页面
<!DOCTYPE html><!--[if lt IE 9]> <html lang="zh" xmlns:ng="http://angu ...
- GoSDK的安装及环境变量配置 入门详解 - 精简归纳
GoSDK的安装及环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 29 转载请注明出处!️ 目录 GoSDK的安装及环境变量配置 入门详解 - 精简归纳 一.进入G ...
- 【转】Loading PNGs with SDL_image
FROM:http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/index2. ...
- 【总结】jvm
一.jvm体系结构 1.jvm整体结构 jvm总体上是由类装载子系统(ClassLoader).运行时数据区.执行引擎三个部分组成. (jvm本质上就是一个java进程) 2.jvm生命周期 (1)j ...
- Pytest里面的测试用例怎么进行前置准备和后置清理操作?
Pytest处理前置后置有两种方式可以处理. 第一种是通过setup和teardown这样的方法去处理: 第二种是通过fixture来实现的.首先先定义fixture,然后在调用.定义fixture, ...
- IC晶圆缺货涨价浪潮持续上涨 无线路由芯片WiFi模块受波及严重
正是多事之秋,继受美国贸易战影响后.由于晶圆供不应求,市场各大行业IC纷纷出现了断货,缺货,涨价的现象.这给了本来低迷的经济市场又一重创.WiFi路由芯片的无线路由模块必不可免的受到了波及. 晶圆代工 ...
- 在IIS中部署前后端应用,多么痛的领悟!
目前手上的Web项目是前后端分离的,所以有时也会倒腾Vue框架. 前后端应用最终以容器形态.在k8s中部署, 为此我搭建了基于Gitlab flow的Devops流程. 在Devops实践中,容器部署 ...
- Python3网络学习案例一:Ping详解
1. 使用Ping做什么 ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常.网络是否通畅等. 2. 效 ...
- vue3.0-如何切换路由-路由模式ts
如何更换路由模式 vue3版本如何切换路由模式?(注:更改后要重启下项目才能看到效果.) 博主,我搜了大半天的,你是怎么找到的? 如下图可看到