一、简介

  在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. 数据可视化之powerBI入门(十二)PowerBI中最重要的函数:CALCULATE

    https://zhuanlan.zhihu.com/p/64382849 介绍DAX的时候,特别强调过一个重要的函数:CALCULATE,本文就来揭秘这个函数的计算原理以及它是如何影响上下文的. C ...

  2. 06 drf源码剖析之权限

    06 drf源码剖析之权限 目录 06 drf源码剖析之权限 1. 权限简述 2. 权限使用 3.源码剖析 4. 总结 1. 权限简述 权限与身份验证和限制一起,决定了是否应授予请求访问权限. 权限检 ...

  3. 03 flask源码剖析之threading.local和高级

    03 threading.local和高级 目录 03 threading.local和高级 1.python之threading.local 2. 线程唯一标识 3. 自定义threading.lo ...

  4. 基于.NetCore3.1系列 ——认证授权方案之Swagger加锁

    一.前言 在之前的使用Swagger做Api文档中,我们已经使用Swagger进行开发接口文档,以及更加方便的使用.这一转换,让更多的接口可以以通俗易懂的方式展现给开发人员.而在后续的内容中,为了对a ...

  5. js自定义方法绑定元素事件

    //事件绑定封装 function addEvent(elem, type, handle){ if(elem.addEventListener){ elem.addEventListener(typ ...

  6. python---Flask使用教程-加载静态文件

    flask的静态文件,一般放在static目录下,前端页面放在templates下(而且这两个名字是定死的(static,templates)),目录结构如图: 模板(index.html)里加载静态 ...

  7. 用Eclipse进行单元测试JUnit4

    (1)在项目中引入Jar包 (2)编写需要测试的类 public class Calculator {     private static int result=0; // 静态变量,用于存储运行结 ...

  8. Burp Suite Extender Module - 扩展模块

    模块功能: 在扩展模块可以通过使用自定义代码,进行Burp 的自定义操作. 1. Burp Extensions页面 2. BApp Store中可以购买和安装别人写好的扩展功能 3. 在APIs界面 ...

  9. Python Ethical Hacking - TROJANS Analysis(3)

    BYPASSING ANTI-VIRUS PROGRAMS AV programs detect viruses based on: 1. Code - compare files to huge d ...

  10. Python Ethical Hacking - WEB PENETRATION TESTING(5)

    Guessing Login Information on Login Pages Our target website: http://10.0.0.45/dvwa/login.php #!/usr ...