时间类

1.时间类

1.1JDK8以前的时间API

  • 设计欠妥,使用不方便,很多都被淘汰了。

  • 都是可变对象,修改后会丢失最开始的时间信息。

  • 线程不安全。

  • 只能精确到毫秒。

1.1.1Date

掌握空参构造和getTime即可,其他了解就行

Date类构造方法: 1. public Date() : 封装此刻的时间 2. public Date(long date) : 根据传入的毫秒值来封装时间

Date now = new Date();
System.out.println(now);
Date time = new Date(5000L);
System.out.println(time);

Date类成员方法:

  1. public long getTime() : 获取时间原点, 到时间对象所经历过的毫秒值

  2. public void setTime(long time) : 根据传入的毫秒值来封装时间

System.out.println(now.getTime());
System.out.println(time.getTime());

1.1.2SimpleDateFormat

public class SimpleDateFormatDemo {
   public static void main(String[] args) throws ParseException {
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入您的生日: (xxxx年xx月xx日)");
       String birthday = sc.nextLine();        // "2008年8月8日"

       // 将[日期字符串]解析为[日期对象]
       SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
       Date birthdayDate = format.parse(birthday);

       // 封装今天的时间
       Date now = new Date();

       // 计算时间差
       long time = now.getTime() - birthdayDate.getTime();

       // 转换单位
       long day = time / 1000 / 60 / 60 / 24;

       System.out.println("您活了" + day + "天!");
  }

   private static void method() {
       // 准备时间对象, 稍后对其进行格式化
       Date now = new Date();

       // 准备时间格式化对象
       SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");

       // 调用格式化的方法, 对时间对象格式化
       String result = format.format(now);

       System.out.println(result);
  }
}

1.1.3Calender

月份从0开始的,输出需要加1

国外星期第一天是星期日不是星期一

Calendar常用成员方法:

1. public int get(int field) : 根据传入的字段, 获取时间值.
                   常用字段:
                               Calendar.YEAR
                               Calendar.MONTH           月份取出之后, 需要+1
                               Calendar.DAY_OF_MONTH
                               Calendar.DAY_OF_WEEK     星期获取出来, 需要查表

                               一  四  五  
                               1  2  3  4  5  6   7

2. public void set(int field, int value) : 为指定的字段设置时间值
3. public void set(int year, int month, int date) :  指定年月日
4. public abstract void add(int field, int amount) : 为给定的日历字段添加或减去指定的时间量

Calendar使用案例:

private static void method() {
   char[] week = {' ', '日', '一', '二', '三', '四', '五', '六'};
   //     0     1     2     3     4     5     6   7

   // 获取Calendar对象, 此刻的时间
   Calendar now = Calendar.getInstance();
   
   //指定年月日
now.set(Calendar.YEAR, 2008);
   now.set(2008, 7, 8);
   
   // 获取指定的时间(年, 月, 日...)
   int year = now.get(Calendar.YEAR);
   int month = now.get(Calendar.MONTH);
   int day = now.get(Calendar.DAY_OF_MONTH);
   int index = now.get(Calendar.DAY_OF_WEEK);

   System.out.println(year);
   System.out.println(month + 1);
   System.out.println(day);
   System.out.println(week[index]);
}

1.2JDK8以后的时间API

  • 设计更合理,功能丰富,使用更方便。

  • 都是不可变对象,修改后会返回新的时间对象,不会丢失最开始的时间

  • 线程安全。

  • 能精确到毫秒、纳秒。

1.2.1日历类

1.LocalDate(年月日) LoaclTime (时分秒) LocalDateTime(年月日时分秒)

2.获取时间对象

3.常用方法

获取年月日时分秒相关的方法

 

// 1. 获取时间对象
LocalDateTime now = LocalDateTime.now();

// 2. 单独获取时间信息
int year = now.getYear();
Month month = now.getMonth();
int monthValue = now.getMonthValue();
int day = now.getDayOfMonth();
int week = now.getDayOfWeek().getValue();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();

修改年月日时分秒相关的方法

  • LocalDateTime 、LocalDate 、LocalTime 都是不可变的, 下列方法返回的是一个新的对象

综合案例:

public class UpdateTimeDemo {
   public static void main(String[] args) {
       LocalDateTime nowTime = LocalDateTime.now();

       // 当前时间
       System.out.println(nowTime);

       // minus : 减去
       // minusYears(年), minusMonths(月), minusDays(日), minusWeeks(周), minusHours(时), minusMinutes(分), minusSeconds(秒), minusNanos(纳秒)
       System.out.println("减一小时:" + nowTime.minusHours(1));
       System.out.println("减一分钟:" +nowTime.minusMinutes(1));
       System.out.println("减一秒钟:" +nowTime.minusSeconds(1));
       System.out.println("减一纳秒:" +nowTime.minusNanos(1));

       System.out.println("对比时间, 确定方法返回的都是新的实例 >>>>>> " +nowTime);

       System.out.println("----------------");

       // plus : 加
       // plusYears(年), plusMonths(月), plusDays(日), plusWeeks(周), plusHours(时), plusMinutes(分), plusSeconds(秒), plusNanos(纳秒)
       System.out.println("加一小时:" + nowTime.plusHours(1));
       System.out.println("加一分钟:" + nowTime.plusMinutes(1));
       System.out.println("加一秒钟:" + nowTime.plusSeconds(1));
       System.out.println("加一纳秒:" + nowTime.plusNanos(1));

       System.out.println("---------------");

       // with : 这里体现出的是,设置效果
       System.out.println("修改的效果:");

       //withYear(年), withMonth(月), withDayOfMonth(日), withHour(时), withMinute(分), withSecond(秒), withNano(纳秒)
       System.out.println(nowTime.withYear(2008));
       System.out.println(nowTime.withMonth(8));
       System.out.println(nowTime.withDayOfMonth(8));
       System.out.println(nowTime.withHour(8));
       System.out.println(nowTime.withMinute(8));
       System.out.println(nowTime.withSecond(8));
       System.out.println(nowTime.withNano(8));
       System.out.println("---------------");

       LocalDate myDate = LocalDate.of(2008, 8, 8);
       LocalDate nowDate = LocalDate.now();

       //2008-08-08是否在nowDate之前?
       System.out.println(myDate + "是否在" + nowDate + "之前? " + myDate.isBefore(nowDate));

       //2008-08-08是否在nowDate之后?
       System.out.println(myDate + "是否在" + nowDate + "之后? " + myDate.isAfter(nowDate));
       System.out.println("---------------------------");

       // 判断两个时间是否相同
       System.out.println(myDate.equals(nowDate));
  }
}

4.LocalDateTime LocalDate Local Time

 

LocalDateTime now = LocalDateTime.now();
LocalDate localDate = now.toLocalDate();
LocalTime localTime = now.toLocalTime();

1.2.2日期格式类

1.用途

用于时间的格式化和解析:

2.常用方法

  1. 对象的获取 :

    static DateTimeFormatter ofPattern(格式) : 获取格式对象
  2. 格式化 :

    String format(时间对象) : 按照指定方式格式化
  3. 解析 :

    LocalDateTime.parse("解析字符串", 格式化对象);
    LocalDate.parse("解析字符串", 格式化对象);
    LocalTime.parse("解析字符串", 格式化对象);

1.2.3时间类

Instant :时间戳/时间线

Instant类 : 用于表示时间的对象, 类似之前所学习的Date

Instant类常见方法 :

static Instant now() : 获取当前时间的Instant对象(标准时间)//需要掌握
ZonedDateTime atZone(ZoneId zone) : 指定时区//需要掌握
//以下了解即可
static Instant ofXxxx(long epochMilli) : 根据(秒/毫秒/纳秒)获取Instant对象
boolean isXxx(Instant otherInstant) : 判断系列的方法
Instant minusXxx(long millisToSubtract) : 减少时间系列的方法
Instant plusXxx(long millisToSubtract) : 增加时间系列的方法

ZoneId : 时区

ZoneId类 : 时区类

常见方法 :

1. static Set<String> getAvailableZoneIds() : 获取Java中支持的所有时区
2. static ZoneId systemDefault() : 获取系统默认时区
3. static ZoneId of(String zoneId) : 获取一个指定时区//String zoneId的获取:网上搜索

ZonedDateTime : 带时区的时间

static ZonedDateTime now() : 获取当前时间的ZonedDateTime对象 //不推荐使用
static ZonedDateTime of(...) : 获取指定时间的ZonedDateTime对象//可以直接设定时区,可以用一用
//了解即可
ZonedDateTime withXxx(时间) : 修改时间系列的方法
ZonedDateTime minusXxx(时间) : 减少时间系列的方法
ZonedDateTime plusXxx(时间) : 增加时间系列的方法

1.2.3工具类

ChronoUnit 用于计算两个“日期”间隔

between(Temporal temporal1Inclusive,Temporal temporal2Exclusive)

计算两个时间对象之间的时间量。

其他两个不需要掌握

Duration 用于计算两个“时间”间隔(秒,纳秒)

Period 用于计算两个“日期”间隔(年、月、日)

posted @   灵泽pro  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示