Java日期时间类库Date/Calendar/JodaTime/LocalDateTime使用详解

简介: 本文目录1. 不够好的开始1.1 Date 日期时间类1.2 Calendar 日历类1.3 SimpleDateFormat 日期时间格式化2. 足够好的JodaTime3. JDK1.8 日期时间API

1. 不够好的开始

Java 日期时间API一直是不够优秀的,再牛X的人,也不可能在每一个领域都十分擅长。爱因斯坦在理论物理上如此吊炸天,但是打一局LOL可能都不是小学生的对手。


在那些遥远的年代,Java Coder们只能用Date、Calendar、SimpleDateFormat这些类库来处理日期时间逻辑。


1.1 Date 日期时间类

Date是Java API里日期时间类库的王牌大哥大,主要用来存储、计算日期时间。常见用法:

/**
 * Date日期时间类Demo
 * @author panda
 * @date 2019-06-26
 */
public class DateDemo {
  public static void main(String[] args) throws InterruptedException {
    //使用当前时间初始化
    Date date1=new Date();
    //暂停1毫秒,使两个时间值不同
    Thread.sleep(1);
    Date date2=new Date();
    //判断时间先后顺序
    System.out.println("date1 after date2? "+date1.after(date2));
    System.out.println("date1 before date2? "+date1.before(date2));
    //判断时间,两者相等返回0,date1早于date2返回负数,date1晚于date2返回正数
    System.out.println("date1 compareTO date2,result is: "+date1.compareTo(date2));
  }
}

OK,看着还可以,但是功能太弱,连加减日期时间的计算都做不到。

1.2 Calendar 日历类

Calendar 可以指定任意日期时间,并且可以对日期时间进行计算,但是日历这个名字起得有点土,不够正宗。

/**
 * Calendar日历Demo
 * @author panda
 * @date 2019-06-26
 */
public class CalendarDemo {
  /**
   * 故事开始之前,先了解下JDK定义的相关常量
   * Calendar.YEAR 年
   * Calendar.MONTH 月
   * Calendar.DATE 日
   * Calendar.HOUR 小时(12小时制)
   * Calendar.HOUR_OF_DAY 小时(24小时制)
   * Calendar.MINUTE 分
   * Calendar.SECOND 秒
   * Calendar.DAY_OF_WEEK 星期几
   */
  public static void main(String[] args) {
    //获取当前日期对应Calendar实例
    Calendar calendar1 = Calendar.getInstance();
    //转换为Date
    System.out.println(calendar1.getTime());
    //展示详细日历信息
    System.out.println(""
        + " 年:"+calendar1.get(Calendar.YEAR)
        + " 月:"+calendar1.get(Calendar.MONTH)
        + " 日:"+calendar1.get(Calendar.DATE)
        + " 时:"+calendar1.get(Calendar.HOUR_OF_DAY)
        + " 分:"+calendar1.get(Calendar.MINUTE)
        + " 秒:"+calendar1.get(Calendar.SECOND)
        + " 星期:"+calendar1.get(Calendar.DAY_OF_WEEK));
    //按年月日时分秒设置日历
    Calendar calendar2=Calendar.getInstance();
    calendar2.set(Calendar.YEAR, 2019);
    calendar2.set(Calendar.MONTH, 9);//注意月份是从0算的,0表示1月,以此类推
    calendar2.set(Calendar.DATE, 1);
    calendar2.set(Calendar.HOUR_OF_DAY, 0);
    calendar2.set(Calendar.MINUTE, 0);
    calendar2.set(Calendar.SECOND, 0);
    System.out.println(calendar2.getTime());
    //日期计算
    calendar2.add(Calendar.YEAR, 1);
    calendar2.add(Calendar.DATE, -1);
    System.out.println(calendar2.getTime());
  }
}

1.3 SimpleDateFormat 日期时间格式化

OK,其实最常用的还是字符串和日期时间之间的转换,Java API里又提供了SimpleDateFormat。

/**
 * SimpleDateFormat格式化日期时间Demo
 * @author panda
 * @date 2019-09-26
 */
public class SimpleDateFormatDemo {
  /**
   * 故事开始之前,预定义了转换格式字符串
   * yyyy年、MM月份、dd日期、HH时、mm分、ss秒 
   * @throws ParseException 
   */
  public static void main(String[] args) throws ParseException {
    //当前日期
    Date date1=new Date();
    //定义格式
    SimpleDateFormat sdf1=new SimpleDateFormat("yyyyMMdd");
    SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd");
    //日期转换为对应格式字符串 非线程安全
    System.out.println(sdf1.format(date1));
    System.out.println(sdf2.format(date1));
    //字符串转换为日期
    String str="20190626";
    Date date2=sdf1.parse(str);
    System.out.println(date2);
  }
}

2. 足够好的JodaTime

JDK自带的日期时间类库是如此平庸,以致于我一直都记不住其类、方法名称,每次使用都感觉非常别扭。然而Java优秀的地方就是有的是非官方的解决方案,简洁、高效、优雅到爆炸。

/**
 * 第三方类库joda-time Demo
 * 需要通过maven或者jar文件导入依赖
 * @author panda
 * @date 2019-06-26
 */
public class JodaTimeDemo {
  public static void main(String[] args) {
    // 创建日期
    DateTime dateTime1 = new DateTime();
    System.out.println(dateTime1);
    // 指定日期时间创建
    DateTime dateTime2 = new DateTime(2019, 10, 1, 10, 00, 00);
    System.out.println(dateTime2);
    // 格式转换 直接对象调用
    System.out.println(dateTime2.toString("yyyy-MM-dd HH:mm:ss"));
    // 使用DateTimeFormatter进行转换(线程安全)
    DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    System.out.println(dtf.print(dateTime2));
    // 将字符串转化为日期
    String str = "2019-10-01 10:00:00";
    System.out.println(dtf.parseDateTime(str));
    // 直接操作对象进行日期计算
    System.out.println(dateTime2.plusDays(1));
    System.out.println(dateTime2.minusHours(2));
    // 计算日期相差天数、月数
    int days = Days.daysBetween(dateTime1, dateTime2).getDays();
    int months = Months.monthsBetween(dateTime1, dateTime2).getMonths();
    System.out.println(days);
    System.out.println(months);
  }
}

毫无疑问,这个已经是我们自己想能到的最简单日期时间API了,而且已经帮我们实现了,还不快点用起来。


3. JDK1.8 日期时间API

像日期时间这么根基性的类库,Java也要与时俱进,于是JDK1.8带来了官方的LocalDate/LocalTime/LocalDateTime,老实说我感觉非常像是模仿的JodaTime,所以实际上JodaTime和JDK1.8日期时间API选用一个就OK了。

/**
 * Java8中日期时间类库Demo
 * 
 * @author panda
 * @date 2019-06-26
 */
public class Java8DateTimeDemo {
  public static void main(String[] args) {
    System.out.println("# LocalDate 日期演示");
    dateDemo();
    System.out.println("# LocalTime 时间演示");
    timeDemo();
    System.out.println("# LocalDateTime 日期时间演示");
    datetimeDemo();
    System.out.println("# LocalDateTime 日期时间与字符串转换演示");
    formatDemo();
  }
  // 日期演示
  public static void dateDemo() {
    // 获取当前日期
    LocalDate localDate = LocalDate.now();
    System.out.println("localDate:" + localDate);
    // 创建指定日期 注意月份是从1开始
    LocalDate myDate = LocalDate.of(2019, 6, 26);
    System.out.println("myDate:" + myDate);
    // 获取日期详情
    System.out.println(myDate.getYear() + "-" + myDate.getMonthValue() + "-" + myDate.getDayOfMonth());
    // 日期比较
    System.out.println("是否相等:" + localDate.equals(myDate));
    System.out.println("是否晚于:" + localDate.isAfter(myDate));
    System.out.println("比较:" + localDate.compareTo(myDate));
    // 日期加减计算
    LocalDate newDate = localDate.plus(1, ChronoUnit.DAYS);
    System.out.println("newDate:" + newDate);
  }
  // 时间演示
  public static void timeDemo() {
    // 获取当前时间
    LocalTime localTime = LocalTime.now();
    System.out.println("localTime:" + localTime);
    // 创建指定时间
    LocalTime myTime = LocalTime.of(10, 10, 10);
    System.out.println("myTime:" + myTime);
    // 获取时间详情
    System.out.println(myTime.getHour() + ":" + myTime.getMinute() + ":" + myTime.getSecond());
    // 时间比较
    System.out.println("是否相等:" + localTime.equals(myTime));
    System.out.println("是否晚于:" + localTime.isAfter(myTime));
    System.out.println("比较:" + localTime.compareTo(myTime));
    // 时间加减计算
    LocalTime newTime = localTime.plus(1, ChronoUnit.HOURS);
    System.out.println("newTime:" + newTime);
  }
  // 日期时间演示
  public static void datetimeDemo() {
    // 获取当前日期时间
    LocalDateTime now = LocalDateTime.now();
    System.out.println("now:" + now);
    // 创建指定日期时间
    LocalDateTime my = LocalDateTime.of(2019, 7, 6, 10, 10, 10);
    System.out.println("my:" + my);
    // 获取日期时间详情
    System.out.println(my.getYear() + "-" + my.getMonthValue() + "-" + my.getDayOfMonth());
    System.out.println(my.getHour() + ":" + my.getMinute() + ":" + my.getSecond());
    // 日期时间比较
    System.out.println("是否相等:" + now.equals(my));
    System.out.println("是否晚于:" + now.isAfter(my));
    System.out.println("比较:" + now.compareTo(my));
    // 日期时间加减计算
    LocalDateTime newDateTime = now.plus(1, ChronoUnit.YEARS);
    System.out.println("newDateTime:" + newDateTime);
  }
  // 格式化压实
  public static void formatDemo() {
    //格式化样式类
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    // 日期时间转字符串
    LocalDateTime now = LocalDateTime.now();
    String nowStr = now.format(formatter);
    System.out.println("nowStr:" + nowStr);
    // 字符串转日期时间
    String datetimeStr = "2019-07-06 10:10:10";
    LocalDateTime datetime = LocalDateTime.parse(datetimeStr, formatter);
    System.out.println("datetime:"+datetime);
  }
}
相关文章
|
5月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
255 1
|
7月前
|
安全 Java API
Java日期时间API:从Date到Java.time
本文深入解析了Java 8中引入的全新日期时间API,涵盖LocalDate、LocalTime、LocalDateTime、ZonedDateTime等核心类的使用,以及时间调整、格式化、时区处理和与旧API的互操作。通过实例对比,展示了新API在可变性、线程安全与易用性方面的显著优势,并提供迁移方案与实战技巧,助你掌握现代Java时间处理的最佳实践。
|
7月前
|
存储 Java
Java LocalDateTime与hutool DateUtil实现秒转换为时分秒格式化展示。
注意:以上代码示例仅适合于处理小于24小时内(86400s) 总积 因 LocalDateTime 和 Local Time 不支持超过24小时表达而 huo tool示例虽然理论上支持但未考虑超过24小时情况下可能出现负值等异常情况处理细节需用户自行添加相关逻辑以确保正确性.
457 7
|
8月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
373 14
|
Java API 调度
Java 日期与时间处理:精准掌控时间流转
Java 8引入了全新的日期和时间API,解决了旧版`java.util.Date`和`Calendar`类设计不佳、操作繁琐的问题。新API包括`LocalDate`、`LocalTime`和`LocalDateTime`类,操作简洁直观,符合日常思维习惯。同时提供了`Period`和`Duration`处理时间间隔,以及`DateTimeFormatter`进行格式化输出。这些改进使开发者能更高效、准确地处理日期和时间,极大提升了开发效率与代码质量。 (239字符)
298 6
java中的日期时间类
java中获取日期时间,util包中的Date类,直接new一个对象打印他就可以,但是格式是外国的,对于我们来说肯定是希望有些格式的。
|
存储 安全 Java
11.4 Java 日期和时间类
我们先来看一些基本概念,然后再介绍 Java 的日期和时间 API。关于日期和时间,有一些基本概念,包括时区、时刻、纪元时、年历等。 全球一共有 24 个时区,英国格林尼治是 0 时区,北京是东八区,也就是说格林尼治凌晨 1 点,北京是早上 9 点。0 时区的时间也称为 GMT+0 时间,GMT 是格林尼治标准时间,北京的时间就是 GMT+8:00。 所有计算机系统内部都用一个整数表示时刻,这个整数是距离格林尼治标准时间1970年1月1日0时0分0秒的毫秒数。为什么要用这个时间呢?更多的是历史原因。 格林尼治标准时间 1970年1月1日0时0分0秒也被称为 Epoch Time(纪元时)
506 0
|
存储 Java API
Java Review (二十一、基础类库----日期、时间类)
Java Review (二十一、基础类库----日期、时间类)
219 0
|
Java 数据库连接 数据库
Java 8 新特性(三)新的日期时间类
老日期类 一说到在Java中处理日期和时间,我们首先想到的肯定是java.util.Date类。确实,由于很多教材和文献都比较老,所以大多数人学习Java的时候使用的都是这个类。
1060 0
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
267 1