核心类
- DateTime 包含日期和时间
- LocalDateTime 使用本地时区的日期和时间
- LocalDate 使用本地时区的日期
- LocalTime 使用本地时区的时间
- DateTimeFormat 一个工厂类,专门生成具体的格式化类
- DateTimeFormatter 具体的格式化类,提供了print方法将DateTime转换为字符串
- Period 计算两个时间之间的差
- Years 只关心年的时间差计算类
- Months 只关心月的时间差计算类
获取当前时间
包含日期和时间
// 特别说明:now方法源码就是new一个DateTime对象并返回
DateTime dateTime1 = DateTime.now();
DateTime dateTime2 = new DateTime();
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime localDateTime1 = new LocalDateTime();
只包含日期
LocalDate localDate1 = LocalDate.now();
LocalDate localDate1 = new LocalDate();
只包含时间
LocalTime localTime1 = LocalTime.now();
LocalTime localTime1 = new LocalTime();
三者相互转换
DateTime dateTime = new DateTime(1995, 2, 5, 12, 30);
LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();
DateTime newDateTime = DateTime.now().withDate(date).withTime(time);
获取指定时间
包含日期和时间
// 年 月 日 时 分 秒
DateTime dateTime1 = new DateTime(2018,1,6,12,56,0);
LocalDateTime localDateTime = new LocalDateTime(2018,1,6,12,56,0);
只包含日期
LocalDate localDate1 = new LocalDate(2018,12,12);
只包含时间
LocalTime localTime1 = new LocalTime(12,32,21);
格式化时间(时间对象 = > 字符串)
调用toString方法
DateTime dateTime = new DateTime(2018,1,6,12,56,0);
String dateTimeStr = dateTime.toString("yyyy-MM-dd HH:mm:ss");
System.out.println(dateTimeStr );
使用格式化类
DateTime dateTime = new DateTime(2016,8,18,14,20);
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
String dateTimeStr = formatter.print(dateTime);
System.out.println(dateTimeStr);
解析字符串(字符串 => 时间对象)
使用格式化类
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
String dateTimeStr = "2017-09-01 23:21:22";
DateTime dateTime = formatter.parseDateTime(dateTimeStr);
System.out.println(dateTime);
Joda => JDK
toDate方法
DateTime dateTime = DateTime.now();
Date jdkDate = dateTime.toDate();
System.out.println(jdkDate);
JDK => Joda
构造函数
DateTime dateTime1 = new DateTime(new Date());
DateTime dateTime2 = new DateTime(Calendar.getInstance());
LocalDateTime localDateTime1 = new LocalDateTime(new Date());
LocalDateTime localDateTime2 = new LocalDateTime(Calendar.getInstance());
LocalDate localDate1 = new LocalDate(new Date());
LocalDate localDate2 = new LocalDate(Calendar.getInstance());
LocalTime localTime1 = new LocalTime(new Date());
LocalTime localTime2 = new LocalTime(Calendar.getInstance());
fromDateFields方法
LocalDateTime.fromDateFields(new Date());
LocalDate.fromDateFields(new Date());
LocalDate.fromDateFields(new Date());
fromCalendarFields方法
LocalDateTime.fromCalendarFields(Calendar.getInstance());
LocalDate.fromCalendarFields(Calendar.getInstance());
LocalTime.fromCalendarFields(Calendar.getInstance());
获取和设置时间
getXXX 获取时间信息 返回值均为int
DateTime dateTime = DateTime.now();
System.out.println("年 : " + dateTime.getYear());
System.out.println("月 : " + dateTime.getMonthOfYear());
System.out.println("日 : " + dateTime.getDayOfMonth());
System.out.println("时 : " + dateTime.getHourOfDay());
System.out.println("分 : " + dateTime.getMinuteOfHour());
System.out.println("秒 : " + dateTime.getSecondOfMinute());
System.out.println("毫秒 : " + dateTime.getMillisOfSecond());
// 特别说明:1就是星期一 2就是星期二 以此类推 7就是星期天
System.out.println("星期几 : " + dateTime.getDayOfWeek());
withXXX 设置时间 返回值均为DateTime
不过,需要注意的是,DateTime是不可变类,修改操作是通过创建并返回新对象来实现的,原对象本身不会变。
DateTime dateTime = DateTime.now();
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
//修改年份为2017年
System.out.println(dateTime.withYear(2017).toString("yyyy-MM-dd HH:mm:ss"));
//修改月份为12月
System.out.println(dateTime.withMonthOfYear(12).toString("yyyy-MM-dd HH:mm:ss"));
//修改天数为当月12号
System.out.println(dateTime.withDayOfMonth(12).toString("yyyy-MM-dd HH:mm:ss"));
调整时间为下午3点20
DateTime dateTime = new DateTime();
dateTime = dateTime.withHourOfDay(15).withMinuteOfHour(20);
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
三小时五分钟后
DateTime dateTime = new DateTime().plusHours(3).plusMinutes(5);
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
下周二上午10点整
DateTime dateTime = new DateTime().plusWeeks(1).withDayOfWeek(2).withMillisOfDay(0).withHourOfDay(10);
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
获取当天的0点
//withMillisOfDay直接设置当天毫秒信息,会同时将时分秒等信息进行修改。
DateTime.now().withMillisOfDay(0);
明天最后一刻
millisOfDay()的返回值比较特别,它是一个属性,具体类为DateTime的一个内部类Property,这个属性代表当天毫秒信息,这个属性有一些方法,可以接着对日期进行修改,withMaximumValue就是将该属性的值设为最大值。
DateTime dateTime = new DateTime().plusDays(1).millisOfDay().withMaximumValue();
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
返回值为Property的方法
yearOfCentury
dayOfYear
monthOfYear
dayOfMonth
dayOfWeek
本月最后一天最后一刻
DateTime dateTime = new DateTime().dayOfMonth().withMaximumValue().millisOfDay().withMaximumValue();
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
下个月第一个周一的下午5点整
new DateTime().plusMonths(1).dayOfMonth().withMinimumValue()
将时间设为了下个月的第一天
plusDays(6).withDayOfWeek(1)将时间设为第一个周一
一个星期中只有 1 + 6 <= 7
plusDays(6) 如果这个月的第一个星期没有星期一的话,那么加上6天日期一定会在这个月的第二星期范围内,第二个星期一定会有星期一
withDayOfWeek(1) 设置为当前星期的第一天,即星期一
DateTime dateTime = new DateTime().plusMonths(1).dayOfMonth().withMinimumValue().plusDays(6).withDayOfWeek(1)
.withMillisOfDay(0).withHourOfDay(17);
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
获取当前日期为星期几
DateTime dateTime = DateTime.now();
String str1 = dateTime.dayOfWeek().getAsShortText(Locale.ENGLISH); //Thu
String str2 = dateTime.dayOfWeek().getAsShortText(Locale.CHINA); //星期几
String str4 = dateTime.dayOfWeek().getAsText(Locale.CHINA); //星期几
String str3 = dateTime.dayOfWeek().getAsString(); //6
时间相关计算
plusXXX 时间相加 返回值均为DateTime
不过,需要注意的是,DateTime是不可变类,修改操作是通过创建并返回新对象来实现的,原对象本身不会变。
DateTime dateTime = DateTime.now();
// 当前时间
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
// 加上2年
System.out.println(dateTime.plusYears(2).toString("yyyy-MM-dd HH:mm:ss"));
//加上12个月
System.out.println(dateTime.plusMonths(12).toString("yyyy-MM-dd HH:mm:ss"));
//加上22天
System.out.println(dateTime.plusDays(22).toString("yyyy-MM-dd HH:mm:ss"));
//加上2个星期
System.out.println(dateTime.plusWeeks(2).toString("yyyy-MM-dd HH:mm:ss"));
minusXXX 时间相减 返回值均为DateTime
不过,需要注意的是,DateTime是不可变类,修改操作是通过创建并返回新对象来实现的,原对象本身不会变。
DateTime dateTime = DateTime.now();
// 当前时间
System.out.println(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
// 减去2年
System.out.println(dateTime.minusYears(2).toString("yyyy-MM-dd HH:mm:ss"));
// 减去12个月
System.out.println(dateTime.minusMonths(12).toString("yyyy-MM-dd HH:mm:ss"));
// 减去22天
System.out.println(dateTime.minusDays(22).toString("yyyy-MM-dd HH:mm:ss"));
// 减去2个星期
System.out.println(dateTime.minusWeeks(2).toString("yyyy-MM-dd HH:mm:ss"));
计算两个时间之间的差
Period 类(存在bug,数据不准确)
DateTime start = new DateTime(2016,8,18,10,58);
DateTime end = new DateTime(2016,9,19,12,3);
Period period = new Period(start,end);
System.out.println(period.getMonths()+"月"+period.getDays()+"天"
+period.getHours()+"小时"+period.getMinutes()+"分");
只关心年 Years类
类似的还有只关心月、只关心日、以此类推
DateTime born = new DateTime(1995, 2, 5, 12, 30);
int age = Years.yearsBetween(born, DateTime.now()).getYears();
System.out.println(age);