一、简介

  在Java8之前,日期时间API一直被开发者诟病,包括:java.util.Date是可变类型,SimpleDateFormat非线程安全等问题。故此,Java8引入了一套全新的日期时间处理API,新的API基于ISO标准日历系统。

Java中位置:

java.lang.Object
java.util.Date
java.sql.Date
public class Date
extends Date一个大约一毫秒值的薄包装,允许JDBC将其标识为SQL DATE值。 毫秒值表示1970年1月1日00:00:00.000 GMT之后的毫秒数。 为了符合SQL DATE ,由java.sql.Date实例包装的毫秒值必须通过在实例关联的特定时区中将小时,分钟,秒和毫秒设置为零来“归一化”。 另请参见:
jdk 帮助文档

二、日期初识

  示例1:获取当天日期

    Java 8中的 LocalDate 用于表示当天日期。和java.util.Date不同,它只有日期,不包含时间。

public static void main(String[] args) {
  LocalDate date = LocalDate.now();
  System.out.println("当前日期=" + date);
}

  示例2:构造指定日期

    调用工厂方法LocalDate.of()创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate实例。这个方法的好处是没再犯老API的设计错误,比如年度起始于1900,月份是从0开始等等

public static void main(String[] args) {
   LocalDate date = LocalDate.of(2000, 1, 1);
   System.out.println("千禧年=" + date);
}

 示例3:获取年月日信息

public static void main(String[] args) {
   LocalDate date = LocalDate.now();
   System.out.printf("年=%d, 月=%d, 日=%d", date.getYear(), date.getMonthValue(), date.getDayOfMonth());
}

 示例4:比较两个日期是否相等

public static void main(String[] args) {
   LocalDate now = LocalDate.now();
   LocalDate date = LocalDate.of(2018, 9, 24);
   System.out.println("日期是否相等=" + now.equals(date));
}

三、时间初识

  示例:获取当前时间

    Java 8中的 LocalTime 用于表示当天时间。和java.util.Date不同,它只有时间,不包含日期

public static void main(String[] args) {
   LocalTime time = LocalTime.now();
   System.out.println("当前时间=" + time);
}

四、比较与计算

  示例1:日期时间计算

    Java8提供了新的plusXxx()方法用于计算日期时间增量值,替代了原来的add()方法。新的API将返回一个全新的日期时间示例,需要使用新的对象进行接收。

public static void main(String[] args) {
           // 时间增量
       LocalTime time = LocalTime.now();
       LocalTime newTime = time.plusHours(2);
       System.out.println("newTime=" + newTime);
           // 日期增量
       LocalDate date = LocalDate.now();
       LocalDate newDate = date.plus(1, ChronoUnit.WEEKS);
       System.out.println("newDate=" + newDate);
       
  }

  示例2:日期时间比较

    Java8提供了isAfter()、isBefore()用于判断当前日期时间和指定日期时间的比较

public static void main(String[] args) {
       
       LocalDate now = LocalDate.now();
       
       LocalDate date1 = LocalDate.of(2000, 1, 1);
       if (now.isAfter(date1)) {
           System.out.println("千禧年已经过去了");
      }
       
       LocalDate date2 = LocalDate.of(2020, 1, 1);
       if (now.isBefore(date2)) {
           System.out.println("2020年还未到来");
      }
       
  }

五、时区

  示例:创建带有时区的日期时间

    Java 8不仅分离了日期和时间,也把时区分离出来了。现在有一系列单独的类如ZoneId来处理特定时区,ZoneDateTime类来表示某时区下的时间。

public static void main(String[] args) {
       
       // 上海时间
       ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");
       ZonedDateTime shanghaiZonedDateTime = ZonedDateTime.now(shanghaiZoneId);
       
       // 东京时间
       ZoneId tokyoZoneId = ZoneId.of("Asia/Tokyo");
       ZonedDateTime tokyoZonedDateTime = ZonedDateTime.now(tokyoZoneId);
       
       DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
       System.out.println("上海时间: " + shanghaiZonedDateTime.format(formatter));
       System.out.println("东京时间: " + tokyoZonedDateTime.format(formatter));
       
  }

六、格式化

  示例1: 使用预定义格式解析与格式化日期

public static void main(String[] args) {
       
       // 解析日期
       String dateText = "20180924";
       LocalDate date = LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE);
       System.out.println("格式化之后的日期=" + date);
       
       // 格式化日期
       dateText = date.format(DateTimeFormatter.ISO_DATE);
       System.out.println("dateText=" + dateText);
       
  }

 示例2:日期和字符串的相互转换

public static void main(String[] args) {
       
       DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
       
       // 日期时间转字符串
       LocalDateTime now = LocalDateTime.now();
       String nowText = now.format(formatter);
       System.out.println("nowText=" + nowText);
       
       // 字符串转日期时间
       String datetimeText = "1999-12-31 23:59:59";
       LocalDateTime datetime = LocalDateTime.parse(datetimeText, formatter);
       System.out.println(datetime);
       
  }

七、工具类

public class DateUtils {
   private static Log logger = LogFactory.getLog(DateUtils.class);
   public static String getFirstDayOfMonth(int year, int month) {
       <a title="java" href="http://www.itxm.cn" target="_blank">Calendar </a>cal = Calendar.getInstance();
       // 设置年份
       cal.set(Calendar.YEAR, year);
       // 设置月份
       cal.set(Calendar.MONTH, month - 1);
       // 设置日历中月份的第1天
       cal.set(Calendar.DAY_OF_MONTH, 1);
       // 格式化日期
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       String firstDayOfMonth = sdf.format(cal.getTime());
       return firstDayOfMonth;
  }
   
   public static String getLastDayOfMonth(int year, int month) {
       Calendar cal = Calendar.getInstance();
       // 设置年份
       cal.set(Calendar.YEAR, year);
       // 设置月份
       cal.set(Calendar.MONTH, month);
       // 设置日历中月份的最后1天
       cal.set(Calendar.DATE, 0);
       // 格式化日期
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       String lastDayOfMonth = sdf.format(cal.getTime());
       return lastDayOfMonth;
  }
   
   public static String getFirstDayOfYear(int year) {
       Calendar cal = Calendar.getInstance();
       // 设置年份
       cal.set(Calendar.YEAR, year);
       // 设置月份
       cal.set(Calendar.MONTH, 0);
       // 设置日历中月份的第1天
       cal.set(Calendar.DAY_OF_MONTH, 1);
       // 格式化日期
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       String firstDayOfYear = sdf.format(cal.getTime());
       return firstDayOfYear;
  }
   
   public static String getLastDayOfYear(int year) {
       Calendar cal = Calendar.getInstance();
       // 设置年份
       cal.set(Calendar.YEAR, year);
       // 设置月份
       cal.set(Calendar.MONTH, 11);
       // 设置日历中月份的最后1天
       cal.set(Calendar.DATE, 0);
       // 格式化日期
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       String lastDayOfYear = sdf.format(cal.getTime());
       return lastDayOfYear;
  }
   
   /**
    * 获取当前月第一天
    * @return
    */
   public static String firstDayOfCurrentMonth(){
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       Calendar cal=Calendar.getInstance();//获取当前日期
       cal.add(Calendar.MONTH, 0);
       cal.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
       return sdf.format(cal.getTime());
  }
   
   /**
    * 获取当前月最后一天
    * @return
    */
   public static String lastDayOfCurrentMonth(){
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       Calendar cal = Calendar.getInstance();//获取当前日期
       cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
       return sdf.format(cal.getTime());
  }
   
   
   public static String compareDate(String firstDate, String lastDate) {
       String retDate = null ;
       if(StringUtils.isEmpty(firstDate) && !StringUtils.isEmpty(lastDate)) {
           return lastDate ;
      }
       if(!StringUtils.isEmpty(firstDate) && StringUtils.isEmpty(lastDate)) {
           return firstDate ;
      }
       if(!StringUtils.isEmpty(firstDate) && !StringUtils.isEmpty(lastDate)) {
           // 格式化日期
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
           try {
               Date first = sdf.parse(firstDate) ;
               Date last = sdf.parse(lastDate) ;
               if(first.after(last)) {
                   return sdf.format(first) ;
              }else{
                   return sdf.format(last) ;
              }
          } catch (ParseException e) {
               logger.error("", e);
          }
      }
       
       return retDate ;
  }
   
   public static Date getNextDay(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       calendar.add(Calendar.DAY_OF_MONTH, +1);//+1今天的时间加一天
       date = calendar.getTime();
       return date;
  }
   
   /**
    * 获取日期的月份
    * @param date
    * @return
    */
   public static String getMonth(Date date){
       Calendar cal = Calendar.getInstance();
       cal.setTime(date);
       int month = cal.get(Calendar.MONTH) + 1;
       if(month < 10){
           return "0"+month;
      } else {
           return String.valueOf(month);
      }
  }
   
   /**
    * 使用用户格式格式化日期
    *
    * @param date日期
    * @param pattern日期格式
    * @return
    */
   public static String format(Date date, String pattern) {
       String returnValue = "";
       if (date != null) {
           SimpleDateFormat df = new SimpleDateFormat(pattern);
           returnValue = df.format(date);
      }
       return (returnValue);
  }
   
   /**
    * 比较两个日期大小
    * @param DATE1
    * @param DATE2
    * @param format 格式 yyyy-MM-dd,yyyy-MM-dd hh:mm:ss
    * @return
    */
   public static int compareDate(String DATE1, String DATE2, String format) {
        DateFormat df = new SimpleDateFormat(format);
        try {
          Date dt1 = df.parse(DATE1);
          Date dt2 = df.parse(DATE2);
          if (dt1.getTime() > dt2.getTime()) {
            return 1;
          } else if (dt1.getTime() < dt2.getTime()) {
            return -1;
          } else {
            return 0;
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        return 0;
      }
   
   public static void main(String[] args) {
       System.out.println(firstDayOfCurrentMonth());
       System.out.println(lastDayOfCurrentMonth());
       String camStartDate = "2016-11-11";
       String camEndDate = "2019-11-11";
       List<String> years = new ArrayList<>();
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       try {
           Date d1 = sdf.parse(camStartDate);
           Date d2 = sdf.parse(camEndDate);
           Calendar c = Calendar.getInstance();
           c.setTime(d1);
           int year1 = c.get(Calendar.YEAR);
           c.setTime(d2);
           int year2 = c.get(Calendar.YEAR);
           do {
               if(year1 >= 2017){
                   years.add(year1 + "");
              }
               year1++;
          } while (year2 >= year1);
           
      } catch (ParseException e) {
           e.printStackTrace();
      }
       System.out.println(years);
  }
   
   /**
    * 传入月份,将period转换为MM的格式
    * @param period
    * @return
    */
   public static String getMonthTwoPlace(String period){
       if(period.length() == 2){
           return period;
      }
       
       if(period.length() == 1){
           return "0" + period;
      }
       return null;
  }
   
   /**
    * 将日期字符串转化为Date类型
    * @param dateStr
    * @param pattern
    * @return
    */
   public static Date StringToDate(String dateStr, String pattern) {
       try {
           DateFormat sdf = new SimpleDateFormat(pattern);
           Date date = sdf.parse(dateStr);
           return date;
      } catch (Exception ex) {
           return null;
      }
  }
   
   /**
    * 将日期转化为字符串类型
    * @param dateStr
    * @param pattern
    * @return
    */
   public static String dateToString(Date date, String pattern) {
       DateFormat sdf = new SimpleDateFormat(pattern);
       String dateStr = sdf.format(date);
       return dateStr;
  }
}

11、Java 日期时间 日期工具类的更多相关文章

  1. Java日期时间实用工具类

    Java日期时间实用工具类 1.Date (java.util.Date)    Date();        以当前时间构造一个Date对象    Date(long);        构造函数   ...

  2. java后端时间处理工具类,返回 "XXX 前" 的字符串

    转自:https://www.cnblogs.com/devise/p/9974672.html 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示 ...

  3. Java关于日期时间的工具类

    import java.sql.Timestamp; import java.text.ParseException; import java.text.ParsePosition; import j ...

  4. [java工具类01]__构建格式化输出日期和时间的工具类

    在之前的学习中,我写过一篇关于字符串格式化的,就主要设计到了时间以及日期的各种格式化显示的设置,其主要时通过String类的fomat()方法实现的. 我们可以通过使用不同的转换符来实现格式化显示不同 ...

  5. 日期/时间处理工具 DateTimeUtil

    此类是我们项目的 日期/时间处理工具,在此做个记录! /* * Copyright 2014-2018 xfami.com. All rights reserved. * Support: https ...

  6. JAVA格式化时间日期

    JAVA格式化时间日期 import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL = 0 * ...

  7. Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题【转】

    Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题 http://blog.didispace.com/Spring-Boot-And-Feign- ...

  8. Java中Date类型如何向前向后滚动时间,( 附工具类)

    Java中的Date类型向前向后滚动时间(附工具类) 废话不多说,先看工具类: import java.text.SimpleDateFormat; import java.util.Calendar ...

  9. Java 后台验证的工具类

    Java 后台验证的工具类 public class ValidationUtil {         //手机号     public static String mobile = "^( ...

  10. Redis 工具类 java 实现的redis 工具类

    最近了解了一下非关系型数据库 redis 会使用简单的命令 在自己本地电脑 使用时必须先启动服务器端 在启动客户端 redis 简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内 ...

随机推荐

  1. MySQL基础架构分析

    文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! MySQL基础架构 一.引言 我们在学习MySQL的时候,迈 ...

  2. combogrid设置多选,并获取多选的值

    1.combogrid设置多选 1.添加该属性 multiple: true, 2.添加该列 {field:'ck',checkbox:true}, 2.获取多选的值 var arr = $(&quo ...

  3. 关于Mint-UI中loadmore组件的兼容性问题

    源代码 遇到的问题 写完了之后数据加载,渲染等等都是没有问题的,但是测试总是提上滑刷新不能用,因为是远程开发,测试提就得改,看代码看文档,看半天看不出来问题,想到了兼容性问题,发现也有人遇到这个坑.安 ...

  4. 如何将elementUI 表格(el-table)和分页器(el-pagination)连接起来

    el-table表格的代码: <template> <el-table :data="tableData" style="width: 100%&quo ...

  5. Java中goto标签的使用

    编写此文仅为以后可以复习. 最近在自学Java核心技术(很好的书,推荐!!),也是第一次从上面了解了goto,或许只是浅层了解. 错误之处希望大佬们给予批评与建议!!谢谢!!! Java核心技术中就提 ...

  6. 题解 洛谷 P4546 【[THUWC2017]在美妙的数学王国中畅游】

    首先发现有连边和删边的操作,所以我们肯定要用\(LCT\)来进行维护. 接下来考虑如何进行\(LCT\)上的信息合并. \(f=1\),则函数为\(f(x)=sin(ax+b)\) \(f=2\),则 ...

  7. 题解 洛谷 P2254 【[NOI2005]瑰丽华尔兹】

    发现在同一时间段中,滑动的方向具有唯一性,所以不难得出\(DP\)方程. \(f_{i,j}=max(f_{i,j},f_{i-dx_,j-dy}+dis_{i,j,i-dx_,j-dy})\) \( ...

  8. ELasticSearch(五)ES集群原理与搭建

    一.ES集群原理 查看集群健康状况:URL+ /GET _cat/health (1).ES基本概念名词 Cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产 ...

  9. springmvc(一)springmvc简介与入门程序

    springmvc概括: Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱 ...

  10. 2.pandas的数据结构

    对于文件来说,读取只是最初级的要求,那我们要对文件进行数据分析,首先就应该要知道,pandas会将我们熟悉的文件转换成了什么形式的数据结构,以便于后续的操作 数据结构 pandas对文件一共有两种数据 ...