时间处理 - Joda

核心类

  • 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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值