1.TimeUnit

TimeUnit是java.util.concurrent包下面的一个类,表示给定单元粒度的时间段
主要作用

  1. 时间颗粒度转换
  2. 延时

    常用的颗粒度

    1. TimeUnit.DAYS //天
    2. TimeUnit.HOURS //小时
    3. TimeUnit.MINUTES //分钟
    4. TimeUnit.SECONDS //秒
    5. TimeUnit.MILLISECONDS //毫秒

    时间颗粒度转换

    ```java //1天有24个小时 1代表1天:将1天转化为小时 System.out.println( TimeUnit.DAYS.toHours( 1 ) );

//结果: 24

//1小时有3600秒 System.out.println( TimeUnit.HOURS.toSeconds( 1 ));

//结果3600

//把3天转化成小时 System.out.println( TimeUnit.HOURS.convert( 3 , TimeUnit.DAYS ) ); //结果是:72

  1. <a name="P3xxk"></a>
  2. ## 延时
  3. ```java
  4. new Thread("thread1") {
  5. @Override
  6. public void run() {
  7. try {
  8. for (int i = 0; i <5 ; i++) {
  9. TimeUnit.SECONDS.sleep(1);
  10. System.out.println(System.currentTimeMillis() +">>>>>>>>"+ Thread.currentThread().getName());
  11. }
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }.start();

2.java处理日期和时间

java.util

Date

  1. toString() //把Date对象变成字符串
  2. getTime() //把Date对象转换成时间戳
  1. Date now = new Date();
  2. System.out.println(now);
  3. System.out.println(now.toString()); // 把now转换成字符形式
  4. System.out.println(now.getTime()); // 通过now获取时间戳

SimpleDateFormat

yyyy: 年

MM: 月

dd: 日

HH: 时

mm: 分

ss: 秒

  1. Date now = new Date();
  2. // 把Date按照格式转换成字符串
  3. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  4. System.out.println(sdf.format(now));
  5. // 把字符串按照格式转换成Date对象
  6. String s1 = "2016-11-20 12:15:35";
  7. Date date1 = sdf.parse(s1);
  8. System.out.println(date1);

Calendar

  1. // 创建实例
  2. Calendar c = Calendar.getInstance();
  3. int y = c.get(Calendar.YEAR); //get(int field) 获得年月日, 时分秒
  4. int m = c.get(Calendar.MONTH);// 得到的月份比实际月份小1
  5. int d = c.get(Calendar.DAY_OF_MONTH);
  6. int w = c.get(Calendar.DAY_OF_WEEK);
  7. int hh = c.get(Calendar.HOUR_OF_DAY);
  8. int mm = c.get(Calendar.MINUTE);
  9. int ss = c.get(Calendar.SECOND);
  10. int ms = c.get(Calendar.MILLISECOND);
  11. Date date = c.getTime(); //Date c.getTime() 获得Date对象
  12. // 获得时间戳
  13. long ms1 = c.getTimeInMillis(); //long getTimelnMillis() 获得毫秒数
  14. System.out.println(ms1);

Date c.getTime() 获得Date对象
long getTimelnMillis() 获得毫秒数
get(int field) 获得年月日, 时分秒
setTime(Date) 设定时间
setTimeInMillis(long) 根据时间戳设置时间
set(int field, int value) 根据年月日等设定时间
setTimeZone(TimeZone) 更改时区
add(int field, int value)

  1. // +5 day
  2. c.add(Calendar.DAY_OF_MONTH, 5);
  3. // -2 hours
  4. c.add(Calendar.HOUR_OF_DAY, -2);

java.time

LocalDate,LocalTime,LocalDateTime

获取当前日期,当前时间,当前日期和时间

  1. // 当前日期
  2. LocalDate ld = LocalDate.now();
  3. // 当前时间
  4. LocalTime lt = LocalTime.now();
  5. // 当前日期和时间
  6. LocalDateTime ldt = LocalDateTime.now();
  7. // 指定日期和时间
  8. LocalDate ld2 = LocalDate.of(2016, 11, 30);
  9. System.out.println("ld2: " +ld2);
  10. LocalTime lt2 = LocalTime.of(15, 16, 17);
  11. System.out.println("lt2: "+lt2);
  12. LocalDateTime ldt2 = LocalDateTime.of(2016, 11, 30, 15, 16, 17);
  13. System.out.println("ldt2: "+ldt2);
  14. LocalDateTime ldt3 = LocalDateTime.of(ld2, lt2);
  15. System.out.println("ldt3:" +ldt3);

DateTimeFormatter

  1. DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  2. System.out.println(dtf.format(LocalDateTime.now()));
  3. LocalDateTime dt3 = LocalDateTime.parse("2016-12-30 15:16:17", dtf);
  4. System.out.println(dt3);//2016-12-30T15:16:17

日期和时间的运算

增加:

plusYears(1): +1年
plusMonths(1): +1月
plusDays(1): +1天
plusHours(1): +1小时
plusMinutes(1): +1 分钟
plusSeconds(1): +1 秒
减少

minusYears(1): +1年
minusMonths(1): +1月
minusDays(1): +1天
minusHours(1): +1小时
minusMinutes(1): +1 分钟
minusSeconds(1): +1 秒

  1. LocalDateTime now = LocalDateTime.now();
  2. LocalDateTime d = now.plusDays(1).minusHours(1);

调整年, 月,日, 时, 分, 秒
withYear(2018): 调整年
withMonth(): 调整月
withDayOfMonth(): 调整为本月的第几天
withDayOfYear(): 调整本年的第几天
withHour(): 调整小时
withMinute(): 调整分钟
withSecond(): 调整秒

判断日期和时间的先后
isBefore()
isAfter()
equals()

计算两个日期的相差时间:Period

  1. LocalDate d1 = LocalDate.of(2018, 11, 20);
  2. LocalDate d2 = LocalDate.of(2050, 1, 2);
  3. Period p = d1.until(d2);
  4. System.out.println(p);// P31Y1M13D
  5. p.getYears()
  6. p.getMonths()
  7. p.getDays()
  8. // 两个日期相差多少天
  9. System.out.println(Math.abs(d1.toEpochDay() - d2.toEpochDay()));// 11366

ZonedDateTime

ZonedDateTime = LocalDateTime + ZoneId
ZonedDateTime: 带时区的日期和时间
ZoneId: 新时区对象(取代就的java.util.TimeZone)

Instant: 时刻对象(内部用long表示epoch seconds)

  1. ZonedDateTime zbj = ZonedDateTime.now();// 当前时区的日期和时间
  2. ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York"));// 纽约时区的日期和时间
  3. // 北京时区变成纽约时区
  4. ZonedDateTime ny = zbj.withZoneSameInstant(ZoneId.of("America/New_York"));
  5. // 把LocalDateTime转换成ZonedDateTime
  6. ZonedDateTime bj = LocalDateTime.now().atZone(ZoneId.systemDefault());
  7. System.out.println(bj);

Joda-Time

https://www.joda.org/joda-time/quickstart.html 完整用户指南: https://www.joda.org/joda-time/userguide.html

  1. <dependency>
  2. <groupId>joda-time</groupId>
  3. <artifactId>joda-time</artifactId>
  4. <version>2.9.2</version>
  5. </dependency>

核心类介绍

下面介绍5个最常用的date-time类:

Instant - 不可变的类,用来表示时间轴上一个瞬时的点
DateTime - 不可变的类,用来替换JDK的Calendar类
LocalDate - 不可变的类,表示一个本地的日期,而不包含时间部分(没有时区信息)
LocalTime - 不可变的类,表示一个本地的时间,而不包含日期部分(没有时区信息)
LocalDateTime - 不可变的类,表示一个本地的日期-时间(没有时区信息)

Instant比较适合用来表示一个事件发生的时间戳。不用去关心它使用的日历系统或者是所在的时区。
DateTime的主要目的是替换JDK中的Calendar类,用来处理那些时区信息比较重要的场景。
LocalDate比较适合表示出生日期这样的类型,因为不关心这一天中的时间部分。
LocalTime适合表示一个商店的每天开门/关门时间,因为不用关心日期部分。

  1. DateTime dateTime1 = new DateTime();
  2. System.out.println(dateTime1); // out: 2016-02-26T16:02:57.582+08:00
  3. DateTime dateTime2 = new DateTime(2016,2,14,0,0,0);
  4. System.out.println(dateTime2); // out: 2016-02-14T00:00:00.000+08:00
  5. DateTime dateTime3 = new DateTime(1456473917004L);
  6. System.out.println(dateTime3); // out: 2016-02-26T16:05:17.004+08:00
  7. DateTime dateTime4 = new DateTime(new Date());
  8. System.out.println(dateTime4); // out: 2016-02-26T16:07:59.970+08:00
  9. DateTime dateTime5 = new DateTime("2016-02-15T00:00:00.000+08:00");
  10. System.out.println(dateTime5); // out: 2016-02-15T00:00:00.000+08:00