您的位置:首页 > 其它

时间处理 - Joda

2018-01-06 13:45 561 查看

核心类

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Joda