Joda-Time

发布时间 2023-10-10 15:10:43作者: 暖气

https://github.com/JodaOrg/joda-time

依赖引入

①Maven

<dependency>
   <groupId>joda-time</groupId>
   <artifactId>joda-time</artifactId>
   <version>2.12.5</version>
</dependency>

②Gradle

compile 'joda-time:joda-time:2.9.9'

核心类

DateTime : 用于代替 JDK 的 Calendar 日历类

DateTime dateTime = new DateTime();
DateTime dateTime = new DateTime(2023, 10, 01, 00, 00, 01, DateTimeZone.UTC);

Instant : 用于表示时间轴上一个瞬间(时间戳)

LocalDate : 用于表示一个本地的日期,不包含时间及时区信息

LocalTime : 用于表示一个本地的时间,不包含日期及时区信息

LocalDateTime : 用于表示一个本地的日期时间,不包含时区信息

DateTime 实例化

①系统时间构造

DateTime dateTime = new DateTime();

②具体时间构造

public DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour)
public DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, DateTimeZone zone)
public DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute)
public DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute, DateTimeZone zone)
public DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute, int millisOfSecond)
public DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute, int millisOfSecond, DateTimeZone zone)

③使用 Calendar 构造

DateTime dateTime = new DateTime(Calendar.getInstance);

④使用其他 DateTime 实例构造

DateTime dateTime = new DateTime(dateTime);

⑤使用字符串构造

DateTime dateTime = new DateTime("2023-01-01T23:59:59-06:00");

DateTime 使用

每次调用方法返回 DateTime 实例时,都会调用 DateTime 的 withMills() 方法判断时间是否发生变化,如果发生变化就会创建一个新实例返回

// 指定时间单位上计算
DateTime dateTime = dateTime.plusDays(1); // 加一天
DateTime dateTime = dateTime.minusMonths(1); // 减一个月
DateTime dateTime = dateTime.withYear(2023); // 指定年份
dateTime.toString("E MM/dd/yyyy HH:mm:ss.SSS"); // 按照格式输出

通过一些方法可以获取到 DateTime 实例的一个 Property 实例,调用 Property 的方法可以再获取一个 DateTime 实例,一般用于对指定的时间位置进行修改

// 先获取一个Property实例,示例中获取的是天的实例,调用withMaximumValue方法将天变成当月最大的一天,再返回一个DateTime实例
DateTime dateTime = dateTime.dayOfMonth().withMaximumValue();

一些静态方法

Days.daysBetween(dateTime1, dateTime2).getDays();
Months.monthsBetween(dateTime1, dateTime2).getDays();
Years.yearsBetween(dateTime1, dateTime2).getDayds();

日期格式化

JDK : SimpleDateFormat 线程不安全,并发环境必须进行同步处理(synchronized / ThreadLocal)

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);

Joda-Time : DateTimeFormatter 线程安全

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
String dateTimeStr = dtf.print(dateTime);

将字符串转换为日期类型

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = dtf.parseDateTime(dateStr)

日期计算

JDK 获取 40 天前日期 : 借助 Calendar 日历类

Date today = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(today);
calendar.add(Calendar.DAT_OF_MONTH, -40);
Date beforeDay = calendar.getTime();

Joda-Time 中 DateTime 自带计算功能

DateTime today = new DateTime();
DateTime beforDay = today.minusDays(40);

计算两个日期相差天数

// JDK
int diffDays = (int) ((today.getTime() - beforeDay.getTime()) / (24 * 40 * 60 * 1000));
// Joda-Time
int diffDays = Days.daysBetween(yesterday, today).getDays();
int diffMonths = Months.monthsBetween(yesterday, oday).getMonths();

与 JDK 日期相互转换

// Date → DateTime
DateTime dateTime = new DateTime(date);
// DateTime → Date
Date date = dateTime.toDate();
// Calendar → DateTime
DateTime dateTime = new DateTime(calendar);
// DateTime → Calendar
Calendar calendar = dateTime.toCalendar(Locale.CHINA);