一、简介

  在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. 一个HashMap能跟面试官扯上半个小时

    一个HashMap能跟面试官扯上半个小时 <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 一个volatile ...

  2. 普通list和树状list互转

    import java.util.ArrayList; import java.util.List; public class TreeNode { private String id; privat ...

  3. 记一次 Microsoft.Bcl.Async 使用经验

    起因: 由于公司项目使用场景存在很多的XP环境,导致使用.NET Framework版本不能大于4.0版本.最近开发新功能时:从nuget上下载一个开源dll(该dll 4.0 版本依赖 Micros ...

  4. pom.xml文件中的parent标签

    基本概念 maven的核心就算pom.xm,使用maven是为了更好地帮项目管理包依赖.如果要引入一个jar包,需要在pom文件中加上 <dependency> <groupId&g ...

  5. Saas Erp以及分销 助手

    首先贴一下相关的截图 SaasErp 登陆页 Saas Erp主页 Saas Erp 其中的商品页 Saas Erp  打印模板设计页 分销助手登录页/手势密码页/主页 1.SaaS是Software ...

  6. 郭的手机出现提示:条码扫描器,抱歉,Android相机出现问题。您可能需要重启设备

    郭的手机出现提示:条码扫描器,抱歉,Android相机出现问题.您可能需要重启设备 ++++++++++++++++++ 原因是系统没有给应用使用摄像头的权限,我到楼下设置对方手机,选择“设置”-&g ...

  7. LFM oversea投资笔记、思摩尔、移卡、建业新生活、鑫苑物业

    LFM oversea 1.公司简介 2.业务展望 3. 投资策略 LFM oversea介绍 LFM oversea是在开曼成立的投资基金, 专注于中国优质企业在香港和美国IPO过程中的 基石.锚定 ...

  8. 使用Spring Validation优雅地校验参数

    写得好的没我写得全,写得全的没我写得好 引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(Use ...

  9. Radiobutton基础语法

    .Radiobutton(root 主窗口,text 文本内容,value 值(可以通过set 和 get 获取到的值),variable 变量修改原来的StringVar) self.radio_m ...

  10. PHP key() 函数

    ------------恢复内容开始------------ 实例 从当前内部指针位置返回元素键名: <?php$people=array("Peter","Joe ...