时间/日期API——基于Java SE8

1.Java 8新的日期/时间API的一些设计原则

Java 8日期/时间API是JSR-310的实现,它的实现目标是克服旧的日期时间实现中所有的缺陷,新的日期/时间API的一些设计原则是:

  • 不变性:新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处。
  • 关注点分离:新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类。
  • 清晰:在所有的类中,方法都被明确定义用以完成相同的行为。举个例子,要拿到当前实例我们可以使用now()方法,在所有的类中都定义了format()和parse()方法,而不是像以前那样专门有一个独立的类。为了更好的处理问题,所有的类都使用了工厂模式和策略模式,一旦你使用了其中某个类的方法,与其他类协同工作并不困难。
  • 实用操作:所有新的日期/时间API类都实现了一系列方法用以完成通用的任务,如:加、减、- - 格式化、解析、从日期/时间中提取单独部分,等等。
  • 可扩展性:新的日期/时间API是工作在ISO-8601日历系统上的,但我们也可以将其应用在非IOS的日历上。

2.LocalDate

LocalDate代表一个IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期

1)创建LocalDate对象
LocalDate now = LocalDate.now();//当前时间2017-12-23
LocalDate of = LocalDate.of(2018, 1, 1);//2017-01-01
LocalDate parse = LocalDate.parse("2019-01-01");//2019-01-01

2)获取LocalDate中每个Field

LocalDate now = LocalDate.now();//2017-12-23
int year = now.getYear();//2017
int month = now.getMonthValue();//12
Month month2 =now.getMonth();//DECEMBER,Month是枚举类型
int dayOfMonth = now.getDayOfMonth();//23
DayOfWeek dayOfWeek = now.getDayOfWeek();//SATURDAY,星期是枚举类型
int dayOfYear = now.getDayOfYear();//357

3)LocalDate中Field的加减

LocalDate now = LocalDate.now();//当前时间2017-12-23
/*天数加减*/
LocalDate yesterday = now.minusDays(1);//2017-12-22
yesterday = now.minus(1, ChronoUnit.DAYS);

LocalDate tomorrow = now.plusDays(1);//2017-12-24
tomorrow = now.plus(1, ChronoUnit.DAYS);

/*月数加减*/
LocalDate lastMonth = now.minusMonths(1);//2017-11-23
lastMonth = now.minus(1, ChronoUnit.MONTHS);

LocalDate nextMonth = now.plusMonths(1);//2018-01-23
nextMonth = now.plus(1, ChronoUnit.MONTHS);

/*年数加减*/
LocalDate lastYear = now.minusYears(1);//2016-12-23
lastYear = now.minus(1,ChronoUnit.YEARS);

LocalDate nextYear = now.plusYears(1);//2018-12-23
nextYear = now.plus(1,ChronoUnit.YEARS);

/*周数加减*/
LocalDate lastWeek = now.minusWeeks(1);//2017-12-16
lastWeek = now.minus(1, ChronoUnit.WEEKS);

LocalDate nextWeek = now.plusWeeks(1);//2017-12-30
nextWeek = now.plus(1, ChronoUnit.WEEKS);

4)with方法

LocalDate now = LocalDate.now();//当前时间2017-12-23
/**LocalDate是final类,now不变*/
/**太多了,不一一展示了,用到时自己试一下就清楚了*/
LocalDate dayOfCurrentMonth = now.withDayOfMonth(4);//返回now所在当前月第4天:2017-12-04
LocalDate dayOfCurrentYear = now.withDayOfYear(350);//返回now所在当前年份第356天:2017-12-16

LocalDate setDateNewYear = now.withYear(2000);//返回now所在年份变为2000年:2000-12-23
LocalDate setDateNewMonth = now.withMonth(7);//返回now所在月份变为7月:2017-07-23

//返回now所在周的周一:2017-12-18
LocalDate setDayOfThisWeek = now.with(ChronoField.DAY_OF_WEEK, 1);
//返回now所在月第25天:2017-12-25
LocalDate setDayOfThisMonth = now.with(ChronoField.DAY_OF_MONTH, 25);
//返回now所在年第2周周末:2017-01-14
LocalDate setWeekendOfThisYear =now.with(ChronoField.ALIGNED_WEEK_OF_YEAR, 2);

5)LocalDate的逻辑判断方法

LocalDate now = LocalDate.now();//当前时间2017-12-23
LocalDate myBirthday = LocalDate.of(1993, 10, 9);

//判断是否是润年
boolean isLeapYear = now.isLeapYear();//false

//判断在日期之前或者之后
boolean isBefore = now.isBefore(myBirthday);//false
boolean isAfter = now.isAfter(myBirthday);//true

//判断LocalDate日期是否相等(注意不是对象,对象一定是不等的)
boolean flag = now.equals(myBirthday);//false

3.LocalTime

LocalTime表示一个时间,而不是日期

1)创建LocalDate对象
LocalTime now =LocalTime.now();//11:31:57.466
LocalTime of = LocalTime.of(12, 00, 00, 1000);//12:00:00.000001
LocalTime parse = LocalTime.parse("12:00:00.0");//12:00

2)一天的开始和结束

System.out.println(LocalTime.MAX);//23:59:59.999999999
System.out.println(LocalTime.MIN);//00:00

其他API和LocalDate类似

4.LocalDateTime

LocalDateTime ≈ LocalDate + LocalTime

5.重复事件检查的方法

利用MonthDay和YearMonth类,前者只记录月日,后者记录年月,可以用equals()方法判断是否相等

6.Period

还有一个常见的任务就是计算两个给定的日期之间包含多少天,多少周或者多少年。你可以用java.time.Period类来完成这个功能。

LocalDate now = LocalDate.now();
LocalDate of = LocalDate.of(1993, 10, 9);
//第二个入参减去第一个入参对应Field
Period between = Period.between(of, now);
int a = between.getDays();//14
int b = between.getMonths();//2
int c = between.getYears();//24

7.自定义的格式器进行格式转换

//字符串解析日期时间
String date = "1993--10--09";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy--MM--dd");
LocalDate localDate = LocalDate.parse(date, dateTimeFormatter);//1993-10-09
//日期时间转换字符串
LocalDate now = LocalDate.now();
dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String format = now.format(dateTimeFormatter);//2017-12-23
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值