Java原本提供了Date和Calendar用于处理日期、时间的类,包括创建日期、时间对象。
一、 Date类
Java提供了Date类(java.util.Date)来处理日期、时间,Date对象既包含日期,也包含时间。Date类从JDK1.0就开始存在了,但是因为历史悠久,所以它的大部分的构造器、方法都已经过时了,不再推荐使用了。
- Date中没有过时的构造器
Date(): 生成一个代表当前日期时间的Date对象,该构造器底层调用System.currentTimeMillis()获取long整数作为日期参数。
Date(long date):根据指定的long整数生成一个Date对象。参数为时间戳,以毫秒作为计时单位。
2. Date中的常用方法
> boolean after(Date when):测试该日期是否在指定日期when之后。
> boolean before(Date when):测试该日期是否在指定日期when之前。
> compareTo(Date anotherDate): 和另一个日期进行比较,当且Date对象在anotherDate之前返回-1,相等返回0,大于返回1
> getTime(): 返回该时间对应的long类型的时间戳,从1970到Date对象之间的时间差,单位ms
> void setTime(long time): 设置该Date对象的时间。
示例:
import java.util.Date;
public class DateTest {
public static void main(String[] args) {
Date d1 = new Date();
System.out.println(d1);
Date d2 = new Date(System.currentTimeMillis() + 1000);
System.out.println(d2);
System.out.println(d1.compareTo(d2));
System.out.println(d1.compareTo(d1));
System.out.println(d2.compareTo(d1));
System.out.println(d1.before(d2));
}
}
二、 Calendar类
- Calendar与Date类相互转换
//创建一个默认的Calendar对象,并根据getTime方法获取一个Date对象
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
//根据Date对象设置Calendar的时间
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date);
2. Calendar类常用的方法如下:
> void add(int field, int amount): 根据日历的规则,为给定的日历字段添加或减去指定的时间量。
> int get(int field): 返回指定日历字段的值。
>int getActualMaximum(int field): 返回指定日历字段可能拥有的最大值。例如月,最大值为11.
> int getActualMinimum(int field): 返回指定日历字段可能拥有的最小值,例如月,
最小值为0
>void roll(int field, int amount): 与add()方法类似,区别在于加上amount后超过了该字段所能表示的最大范围时,也不会向上一个字段进位。
> void set(int field, int value): 将给定的日历字段设置为给定值
>void set(int year, int month, int date): 设置Calendar对象的年月日三个字段的值。
>void set(int year,int month,int date, int hourOfDay,int minute,int second): 设置Calendar对象的年、月、日、时、分、秒6个字段的值
上面field参数是Calendar类的类变量,如Calendar.YEAR、Calendar.MONTH等分别代表年、月、日、小时、分钟、秒等时间字段。月份的起始时间不是1,而是0,所以0~11分别代表1~12月。
add()和roll()的区别
add()当超出当前字段的范围时,会发生进位,即上一级字段也会增大或变小。
roll()只与当前字段有关,当被修改的字段超出范围,不会影响上一级字段。所以可能出现减去一个数,日期反而增大的情况。
示例:
public class CalendarTest {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
//分别获取当前时间的年、月、日
System.out.println(c.get(Calendar.YEAR));
System.out.println(c.get(Calendar.MONTH));
System.out.println(c.get(Calendar.DATE));
//设置时间为2022-01-01 10:30:00
c.set(2022, Calendar.JANUARY , 1, 10, 30, 0);
System.out.println(c.getTime());
//将时间增加1年
c.add(Calendar.YEAR, 1); //2023-01-01 10:30:00
System.out.println(c.getTime());
//获取Calendar对象c2和c1时间相同
Date date1 = c.getTime();
Calendar c2 = Calendar.getInstance();
c2.setTime(date1);
//时间往前推8个月,roll只有当前MONTH位有关,不会向上一位进位或将位
c.roll(Calendar.MONTH, -8);
System.out.println(c.getTime()); //2023-05-01 10:30:00
//时间往前推8个月
c2.add(Calendar.MONTH, -8); //2022-05-01 10:30:00
System.out.println(c2.getTime());
//roll和add的区别,roll当前位不会向上一位进位
}
}
三、 Java 8新增的日期、时间包
Java 8专门新增了一个java.time包,该包下包含如下常用的类。
> Clock: 该类用于获取指定时区的当前日期、时间。该类可取代System类的currectTimeMillis()方法,而且提供了更多方法来获取当前日期、时间。该类提供了大量静态方法来获取Clock对象。
> Duration: 该类代表持续时间。该类可以非常方便地获取一段时间。通常用秒或者纳秒相结合来表示一个时间量,最高精度为纳秒。
> Period: 与Duration类似都是用来表示持续时间,但是Period是由年月日为单位的时间量,例如1年2个月3天
初始化Period
ofXXX()系列方法: 根据年月日来构造持续时间
from(TemporalAmount amount):根据TemporalAmount实例创建Period对象
parse(CharSequence text):根据ISO-8601持续时间格式字符串创建Period对象
between(LocalDate startDateInclusive, LocalDate endDateExclusive):获取两个日期对象之间的持续时间。
> Instant: 代表一个具体的时刻,可以精确到纳秒。该类提供了静态的now()方法来获取当前上课,也提供了静态的now(Clock clock)方法来获取clock对应的时刻。除此之外,它还提供了一系列minusXXX()方法在当前时刻基础上减去一段时间,也提供了plusXXX()方法在当前时刻基础上加上一段时间。
> LocalDate: 该类代表不带时区的日期,例如 2022-01-01。该类提供了静态的now()方法来获取当前日期,也提供了静态的now(Clock clock)方法获取clock对应的日期。除此之外,它还提供了minusXXX()方法在当前年份基础上减去几年、几月、几周或几日等,也提供了plusXXX()方法在当前日期基础上加上几年、几月、几周或几日等。
> LocalTime: 该类代表不带时区得时间,例如 10:15:30。该类提供了提供了静态得now()方法来获取当前日期,也提供了静态now(Clock clock)方法来获取clock对应得时间。除此之外,它还提供了minusXXX()方法在当前时间得基础上减去几小时、几分、几秒等,也提供了plusXxx()方法在当前年份基础上加上几小时、几分、几秒等。
> LocalDateTime:该类代表不带时区得日期、时间,了例如2022-01-01T10:00:00。该类提供了静态的now()方法来获取当前日期、时间,也提供了minusXXX()/plusXXX()减去/增加几年、几月、几日、几小时、几分、几秒等。
> MonthDay: 该类仅代表月日,例如:--05-01。该类提供了静态的now()方法来获取当前月日,也提供了静态的now(Clock clock)方法获取clock对应的月日。
> Year: 该类仅代表年,例如 2022。该类提供了静态的now()方法来获取当前年份,也提供了静态的now(Clock clock)方法来获取clock对应的年份。也提供minusYears()/plusYears()减去/增加几年。
>YearMonth: 该类仅代表年月,例如:2022-01。该类提供了静态的now()方法来获取当前年月,也提供了静态的now(Clock clock)方法来获取clock对应的年月。除此之外,它还提供了minuxXXX()/plusXXX()减去/增加几年、几月
> ZonedDateTime: 该类代表一个时区化的日期、时间
> ZoneId: 该类代表一个时区
> DayOfWeek: 这是一个枚举类,定义了周日到周六的枚举值
>Month:这是一个枚举类,定义1月到12月的枚举值。
public static void main(String[] args) {
//-------------------Clock--------------------
//获取当前Clock
Clock clock = Clock.systemUTC();
System.out.println(clock.getZone());
System.out.println("当前UTC时刻为:"+ clock.instant());
//当前时间对应的时间戳毫秒
System.out.println("当前时间戳:"+ clock.millis());
System.out.println("当前时间戳:"+ System.currentTimeMillis());
//带时区的Clock
Clock localClock = Clock.system(ZoneId.systemDefault());
System.out.println("当前时区为:" + localClock.getZone());
System.out.println("当前时刻为:" + localClock.instant());
//-------------------Duration--------------------
Duration d = Duration.ofSeconds(3600);
System.out.println("3600s相当于" + d.toMinutes() + "分");
System.out.println("3600s相当于" + d.toHours() + "时");
System.out.println("3600s相当于" + d.toDays() + "天");
//在clock基础上增加3600s,返回新的Clock
Clock clock2 = Clock.offset(clock, d);
System.out.println("当前时间加3600s为:" + clock2.instant());
//求两个时间的差值
Duration duration = Duration.between(LocalDateTime.now(), LocalDateTime.now().plusDays(1));
System.out.println(duration.toHours());
System.out.println(duration.toDays());
//-------------------Instant--------------------
//获取当前时间
Instant instant = Instant.now();
System.out.println(instant);
//在instant基础上加3600s
Instant newInstant = instant.plusSeconds(3600);
System.out.println(newInstant);
//根据时间字符串解析出Instant对象
Instant instant3 = Instant.parse("2021-11-30T17:30:00.000Z");
System.out.println(instant3);
//在instant3基础上加3小时10分钟
Instant instant4 = instant3.plus(Duration.ofHours(3).plusMinutes(10));
System.out.println(instant4);
//获取instant4 5天前的时间
Instant instant5 = instant4.minus(Duration.ofDays(5));
System.out.println(instant5);
//-------------------LocalDate--------------------
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
//获取2022年第100天的日期
LocalDate localDate2 = LocalDate.ofYearDay(2022, 125);
System.out.println(localDate2);
//设置为2022年5月5日
LocalDate localDate3 = LocalDate.of(2022, Month.MAY, 5);
System.out.println(localDate3);
//获取Epoch Day,即从1970年1月1日到localDate3的间隔天数
System.out.println(localDate3.toEpochDay());
//-------------------LocalTime--------------------
//获取当前时间(时分秒)
LocalTime localTime1 = LocalTime.now();
System.out.println(localTime1);
//设置时间18:00:00
//如果秒为0,则输出18:00
//如果秒不为0,则输出18:00:xx
LocalTime localTime2 = LocalTime.of(18, 0, 0);
System.out.println(localTime2);
//返回一天中的第10000s对应的时间
LocalTime localTime3 = LocalTime.ofSecondOfDay(10000);
System.out.println(localTime3);
//-------------------LocalDateTime--------------------
LocalDateTime localDateTime1 = LocalDateTime.now();
System.out.println(localDateTime1);
//加上1天,减去60分钟
LocalDateTime localDateTime2 = localDateTime1.plusDays(1).minusMinutes(60);
System.out.println(localDateTime2);
//获取LocalDate
System.out.println(localDateTime1.toLocalDate());
//解析时间字符串
LocalDateTime localDateTime3 =
LocalDateTime.parse("2022-05-01 18:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(localDateTime3);
//-------------------Year、YearMonth、MonthDay--------------------
Year year = Year.now();
System.out.println(year);
//获取year年的第100天的日期
LocalDate localDate = year.atDay(100);
System.out.println(localDate);
//加一年
System.out.println(year.plusYears(1));
YearMonth yearMonth = YearMonth.now();
System.out.println(yearMonth);
MonthDay monthDay = MonthDay.now();
System.out.println(monthDay);
}
推荐阅读:https://blog.youkuaiyun.com/qq_33619378/article/details/108791509
以上主要整理自<Java疯狂讲义>
2687



被折叠的 条评论
为什么被折叠?



