一、日期类
在程序开发中经常会遇到日期类的操作,在JDK1.8之前的版本中,所有关于时间和日期的API在使用上都存在缺陷。
- 易用性差,时间的计算方式烦琐。
- 不是线程安全的。
基于以上问题,JDK1.8引入了一套全新的时间日期API,借助新的API可以用更简洁的方法处理时间和日期。
二、创建日期对象
在JDK1.8中,日期和时间的类都位于java.time包中,它是新的Java日期/时间API的基础包,这些类都是不可变的、线程安全的,在绝大多数情况下,这些类能够有效地处理一些公共的需求。java.time包中表示日期的常用类如以下表格:
类 | 描述 |
---|---|
LocalDate | 表示日期(年/月/日),不包含时间,如2024-03-23 |
LocalTime | 表示时间(时/分/秒/毫秒),不包含日期,如23:10:24 |
LocalDateTime | 表示日期和时间(年/月/日/时/分/秒/毫秒),如2024-03-23 23:10:24 |
LocalDate类、LocalTime类、LocalDateTime类的实例是不可变的对象,它提供了简单的日期或时间,并不包含时间信息,也不包含与时区相关的信息。日期类的通用方法如以下表格:
方法 | 描述 |
---|---|
日期类 now() | 静态方法,根据当前时间创建对象,返回日期对象 |
日期类 of(int year,Month month,int dayOfMonth) | 静态方法,根据指定日期/时间创建日期类对象,如LocalDate.of(2024,Month.APRIL,4) |
Month getMonth() | 获取月份,返回Month,是一个表示月份的枚举 |
int getDayOfMonth() | 返回当前日期类对象的月份天数 |
int getYear() | 返回当前日期类对象的年份 |
日期类 plusDays()、日期类 plusDays()、日期类 plusMonths()、日期类 plusYear() | 在指定日期的基础上添加天数、周数、月数、年数,返回日期类对象 |
表格中的“日期类”指LocalDate、LocalTime、LocalDateTime等类型。运用这些类,可以实现获取日期时间类对象。例如,获取当前日期或时间的代码如下实例:
LocalDate localDate=LocalDate.now(); //获取当前日期
LocalTime localTime=LocalTime.now(); //获取当前时间
三、日期格式化
有时需要按照定义的格式输出系统时间,这就需要使用DateTimeFormatter类的相关方法进行日期格式化处理,该类位于java.time.format包中。日期类中的format()方法用于将日期格式化字符串,该方法接受一个DateTimeFormatter对象,除此之外,DateTimeFormatter类的format()方法也可以实现日期格式化。
代码示例:
DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy年MM月dd日");
//两种格式化方式
String str1=localDate.format(formatter);
String str2=formatter.format(localDate);
在以上代码中,ofPattern()方法用于指定日期格式。参数为格式字符串,该方法的作用是指定日期输出格式。
根据当前日期,计算农场下次播种时间和收割时间,要求如下:
- 使用不同格式输出当前日期,如"yyyy年MM月dd日 HH:mm:ss" “yyyy-MM-dd”。
- 分别提取当前日期对应的年、月、日信息并输出。
- 输入当前日期距离下次播种还有几个月,计算并输出下次播种时间。
- 输入收割时间,并输出到控制台。
代码示例:
public class TimeTest {
public static void main(String[] args) {
//1、获取现在时间
LocalDateTime today=LocalDateTime.now();
//2、创建格式化器
DateTimeFormatter fm1= DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
DateTimeFormatter fm2=DateTimeFormatter.ofPattern("yyyy-MM-dd");
//3、将日期格式化为字符串
String str1=today.format(fm1);
String str2=today.format(fm2);
System.out.println("当前日期(日期+时间):"+str1+"。");
System.out.println("当前日期:"+str2+"。");
//4、提取日期中的年、月、日信息
System.out.println("年:"+today.getYear()+" 月:"+today.getMonth()+" 日:"+today.getDayOfMonth());
//5、根据时隔时间输出日期
System.out.println("距离下次播种大约还有几个月?(1~12间的整数):");
Scanner input=new Scanner(System.in);
LocalDateTime future=today.plusMonths(input.nextLong());
String str3=future.format(fm2);
System.out.println("下次播种时间约为:"+str3+"。");
//6、根据输入时间输出
System.out.println("请输入计划开始收割日期(格式:yyyy-MM-dd):");
LocalDate ld=LocalDate.parse(input.next());//将字符串转换为日期
String str4=ld.format(fm2);
System.out.println("收割开始日期为"+str4+",预祝好收成!");
}
}
运行结果:
当前日期(日期+时间):2024年03月23日 23:36:35。
当前日期:2024-03-23。
年:2024 月:MARCH 日:23
距离下次播种大约还有几个月?(1~12间的整数):
4
下次播种时间约为:2024-07-23。
请输入计划开始收割日期(格式:yyyy-MM-dd):
2024-07-23
收割开始日期为2024-07-23,预祝好收成!