joda-time 工具类的使用

文章目录

      • jar 包依赖
      • 类说明
      • 构造一个DateTime实例
      • 方法
        • 字符串和时间的相互转换
      • 日期1 是否在 日期2 之前/后
      • 日期之间计算
      • 设置 dateTime 对象的属性值
      • 判断闰年 & 闰月
      • 对一个 DateTime 的某些属性进行置 0 操作
      • 综合应用

 

jar 包依赖

<dependency>
    <groupId>joda-timegroupId>
    <artifactId>joda-timeartifactId>
    <version>2.10.2version>
dependency>

 

类说明

  • Instant:不可变类,代表时间线上的一个瞬时的时间点
  • DateTime:不可变类,它以毫秒级的精度封装时间上的某个瞬间时刻,用来替换JDK的Calendar类
  • LocalDate:不可变类,该类封装了一个年/月/日的组合。没有时区信息
  • LocalTime:不可变类,表示一个本地的时间,而不包含日期部分。没有时区信息
  • LocalDateTime:不可变类,该类封装了一个年/月/日 时:分:秒的组合。没有时区信息

 

构造一个DateTime实例

  • DateTime():这个无参的构造方法会创建一个在当前系统所在时区的当前时间,精确到毫秒
  • DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute):这个构造方法方便快速地构造一个指定的时间,这里精确到秒,类似地其它构造方法也可以传入毫秒。
  • DateTime(long instant):这个构造方法创建出来的实例,是通过一个long类型的时间戳,它表示这个时间戳距1970-01-01T00:00:00Z的毫秒数。使用默认的时区。
  • DateTime(Object instant):这个构造方法可以通过一个Object对象构造一个实例。这个Object对象可以是这些类型:ReadableInstant, String, Calendar和Date。其中String的格式需要是ISO8601格式
     
DateTime dateTime = new DateTime();
System.out.println(dateTime.toString("yyyy-MM-dd"));

DateTime dateTime = new DateTime(2017, 11, 27, 14, 30, 50, 500);
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss.SSS"));

// java.util.Date 转 DateTime
DateTime dateTime = new DateTime(new Date());
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss.SSS"));

 

方法

  • with开头的方法(比如:withYear):用来设置DateTime实例的某个时间。因为DateTime是不可变对象,所以没有提供setter方法可供使用,with方法也没有改变原有的对象,而是返回了设置后的一个副本对象。
  • plus/minus开头的方法(比如:plusDay, minusMonths):用来返回在DateTime实例上增加或减少一段时间后的实例。
  • 返回Property的方法:Property是DateTime中的属性,保存了一些有用的信息

 

字符串和时间的相互转换

// 将字符串转换为时间
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss SSS");
DateTime dateTime = formatter.parseDateTime("2019-07-09 16:20:20 123");

// 将时间转换为字符串
DateTime dateTime = new DateTime();
String dateString = dateTime.toString("yyyy-MM-dd");
System.out.println(dateString);
DateTimeFormatter forPattern = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS");
dateString = forPattern.print(dateTime);
System.out.println(dateString);

 

日期1 是否在 日期2 之前/后

DateTime now = new DateTime();
DateTime yesterday = now.minusDays(1);
System.out.println(now.toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(yesterday.toString("yyyy-MM-dd HH:mm:ss.SSS"));
// 日期 now 是否在 yesterday 之前
System.out.println(now.isBefore(yesterday));
// 日期 now 是否在当前时间之前
System.out.println(now.isBeforeNow());
System.out.println(now.isAfter(yesterday));
System.out.println(now.isAfterNow());

 

DateTime dateTime = new DateTime();
// 当前日期
System.out.println(dateTime.toString("yyyy-MM-dd"));
System.out.println();

// 一周中的第几天
System.out.println(dateTime.getDayOfWeek());
// 当前日期所在周的周一
System.out.println(dateTime.dayOfWeek().withMinimumValue().toString("yyyy-MM-dd"));
// 当前日期所在周的周天
System.out.println(dateTime.dayOfWeek().withMaximumValue().toString("yyyy-MM-dd"));
System.out.println();

// 当前日期在当前月的第几天
System.out.println(dateTime.getDayOfMonth());
// 当前日期所在当前月的第一天
System.out.println(dateTime.dayOfMonth().withMinimumValue().toString("yyyy-MM-dd"));
// 当前日期所在当前月的最后一天
System.out.println(dateTime.dayOfMonth().withMaximumValue().toString("yyyy-MM-dd"));
System.out.println();

// 当前日期在当前年的第几天
System.out.println(dateTime.getDayOfYear());
// 当前日期所在当前年的第一天
System.out.println(dateTime.dayOfYear().withMinimumValue().toString("yyyy-MM-dd"));
// 当前日期所在当前年的最后一天
System.out.println(dateTime.dayOfYear().withMaximumValue().toString("yyyy-MM-dd"));

 

DateTime dateTime = new DateTime();
// 当前日期
System.out.println(dateTime.toString("yyyy-MM-dd"));
System.out.println();

// 加、减一年
System.out.println(dateTime.plusYears(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.minusYears(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));

// 加、减一月
System.out.println(dateTime.plusMonths(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.minusMonths(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));

// 加、减一天
System.out.println(dateTime.plusDays(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.minusDays(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));

// 加、减一小时
System.out.println(dateTime.plusHours(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.minusHours(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));

// 加、减一分钟
System.out.println(dateTime.plusMinutes(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.minusMinutes(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));

// 加、减一秒
System.out.println(dateTime.plusSeconds(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.minusSeconds(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));

// 加、减一毫秒
System.out.println(dateTime.plusMillis(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.minusMillis(1).toString("yyyy-MM-dd HH:mm:ss.SSS"));

 

DateTime dateTime = new DateTime();
// 当前日期
System.out.println(dateTime.toString("yyyy-MM-dd"));
System.out.println();

// 得到当前日期所在周的上一周的第一天(上N周为 minusWeeks(n))
System.out.println(dateTime.dayOfWeek().withMinimumValue().minusWeeks(1).toString("yyyy-MM-dd"));
// 得到当前日期所在周的上一周的最后一天
System.out.println(dateTime.dayOfWeek().withMaximumValue().minusWeeks(1).toString("yyyy-MM-dd"));

// 得到当前日期所在周的下一周的第一天(下N周为 plusWeeks(n))
System.out.println(dateTime.dayOfWeek().withMinimumValue().plusWeeks(1).toString("yyyy-MM-dd"));
// 得到当前日期所在周的下一周的最后一天
System.out.println(dateTime.dayOfWeek().withMaximumValue().plusWeeks(1).toString("yyyy-MM-dd"));



// 得到当前日期所在月的上一月的第一天(上 N 月为 minusMonths(n))
System.out.println(dateTime.dayOfMonth().withMinimumValue().minusMonths(1).toString("yyyy-MM-dd"));
// 得到当前日期所在月的上一月的最后一天
System.out.println(dateTime.dayOfMonth().withMaximumValue().minusMonths(1).toString("yyyy-MM-dd"));

// 得到当前日期所在月的上一月的第一天(下 N 月为 plusMonths(n))
System.out.println(dateTime.dayOfMonth().withMinimumValue().plusMonths(1).toString("yyyy-MM-dd"));
// 得到当前日期所在月的上一月的最后一天
System.out.println(dateTime.dayOfMonth().withMaximumValue().plusMonths(1).toString("yyyy-MM-dd"));

 

日期之间计算

DateTime dateTime = new DateTime();
// 当前日期
System.out.println(dateTime.toString("yyyy-MM-dd"));
// 去年
DateTime lastYear = dateTime.plusYears(1);

// 计算两个日期相差多少年
System.out.println(Years.yearsBetween(dateTime, lastYear).getYears());
// 计算两个日期相差多少月
System.out.println(Months.monthsBetween(dateTime, lastYear).getMonths());
// 计算两个日期相差多少天
System.out.println(Days.daysBetween(dateTime, lastYear).getDays());



DateTime today = new DateTime();
// 当前日期
System.out.println(today.toString("yyyy-MM-dd HH:mm:ss.SSS"));
// 当前日期的上一天(昨天)
DateTime yesterday = today.plusDays(1);
// 计算两个日期相差多少小时
System.out.println(Hours.hoursBetween(today, yesterday).getHours());
// 计算两个日期相差多少分钟
System.out.println(Minutes.minutesBetween(today, yesterday).getMinutes());
// 计算两个日期相差多少秒
System.out.println(Seconds.secondsBetween(today, yesterday).getSeconds());

 

设置 dateTime 对象的属性值

// 方式1
DateTime dateTime = new DateTime();
// 当前日期
System.out.println(dateTime.toString("yyyy-MM-dd"));

// 将当前日期的天设置为 20 号
System.out.println(dateTime.dayOfMonth().setCopy(20).toString("yyyy-MM-dd"));
// 将当前日期的月份设置为 3
System.out.println(dateTime.monthOfYear().setCopy(3).toString("yyyy-MM-dd"));
// 将当前日期的年份设置为 2000
System.out.println(dateTime.year().setCopy(2000).toString("yyyy-MM-dd"));


// 方式2
DateTime dateTime = new DateTime();
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss.SSS"));
// 将 dateTime 日期的年份位设置为 2000
dateTime = dateTime.withYear(2000);
// 将 dateTime 日期的月份位设置为 10
dateTime = dateTime.withMonthOfYear(10);
dateTime = dateTime.withDayOfMonth(1);
dateTime = dateTime.withHourOfDay(20);
dateTime = dateTime.withMinuteOfHour(20);
dateTime = dateTime.withSecondOfMinute(15);
dateTime = dateTime.withMillisOfSecond(100);
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss.SSS"));

 

判断闰年 & 闰月

DateTime dateTime = new DateTime();
// 当前日期
System.out.println(dateTime.toString("yyyy-MM-dd"));

// 判断是否是闰年
System.out.println(dateTime.year().isLeap());
// 判断是否是闰月
System.out.println(dateTime.monthOfYear().isLeap());

String formatter="yyyy-MM-dd HH:mm:ss";
// 获取一天的开始时间
System.out.println(dateTime.withTimeAtStartOfDay().toString(formatter));
// 获取一天的结束时间
System.out.println(dateTime.millisOfDay().withMaximumValue().toString(formatter));

 

对一个 DateTime 的某些属性进行置 0 操作

DateTime dateTime = new DateTime();
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss.SSS"));

System.out.println(dateTime.dayOfWeek().roundCeilingCopy().toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.dayOfWeek().roundFloorCopy().toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println();

System.out.println(dateTime.minuteOfDay().roundCeilingCopy().toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.minuteOfDay().roundFloorCopy().toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println();

System.out.println(dateTime.secondOfMinute().roundCeilingCopy().toString("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println(dateTime.secondOfMinute().roundFloorCopy().toString("yyyy-MM-dd HH:mm:ss.SSS"));

程序运行输出

2019-07-09 20:51:45.193
2019-07-10 00:00:00.000
2019-07-09 00:00:00.000

2019-07-09 20:52:00.000
2019-07-09 20:51:00.000

2019-07-09 20:51:46.000
2019-07-09 20:51:45.000

 

综合应用

/**
  * 获取 year 年 第 month 月 的第 week 周的 周几(weekIndex)
  *
  * 获取 2019 年 7 月份 第 3 周的 周三 的日期
  * obtainDate("2019", 7, 3, 3);
  * */
public static DateTime obtainDate(String year, int month, int week, int weekIndex) {
    String date = MessageFormat.format("{0}-01-01", year);
    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
    DateTime dateTime = DateTime.parse(date, formatter);
    dateTime = dateTime.
                monthOfYear().setCopy(month).       // 设置月份为 month 月
                dayOfMonth().withMinimumValue().    // 获取 month 月的第一天的日期
                plusDays((week - 1) * 7).           // 在 month 月第一天基础上加上 n 天
                withDayOfWeek(weekIndex);           // 设置为周几
    return dateTime;
}

你可能感兴趣的:(Java类库)