Java常用API_时间

本文详细介绍了JavaJDK7中的Date类、TimeZone、Instant、ZoneDateTime、Calendar以及SimpleDateFormat等类的使用方法,包括时间原点、时间操作、格式化、时区处理和日期计算等,并通过实例展示了如何在实际场景中应用这些技术。
摘要由CSDN通过智能技术生成

一,JDK7时间:

1.Date:

        我先通过一段代码简单展示一下它的几个方法及功能

代码:

        这里要注意的是

        时间原点:1970年1月1日 00:00:00

        中国的时间原点:由于中国处在东八区,时间原点要晚上8小时,即为1970年1月1日08:00:00

        下方代码第二点,创建一个对象表示一个指定的时间中:

              1.括号中的参数为long类型单位为毫秒,所以在0后面加了一个大写的L,提高代码可读性

              2.填写的参数为0,即表示把从时间原点开始过0毫秒后的时间赋值给这个对象中

        下方代码第三点,setTime修改时间中:

              1.括号中的参数类型也为long,且单位为毫秒,所以数字后面使用L修饰

              2.填写1000表示把从时间原点开始过1000毫秒后的时间赋值给这个对象

public class Demo1 {
    public static void main(String[] args) {
        //1.创建对象表示一个时间(当前时间)
        Date d1 = new Date();
        System.out.println(d1);

        //2.创建对象表示一个指定的时间
        Date d2 = new Date(0L);
        System.out.println(d2);

        //3.setTime修改时间
        d2.setTime(1000L);
        System.out.println(d2);

        //4.getTime获取当前时间距离时间原点的毫秒值
        long time = d2.getTime();
        System.out.println(time);
    }
}
运行结果:

小练习:

题目:需求1:打印时间原点开始一年之后的时间

           需求2:定义两个Date对象,比较一下哪个在前哪个在后

代码:
public class Test1 {
    public static void main(String[] args) {
        //需求1:打印时间原点开始一年之后的时间
        //创建对象表示时间原点
        Date d1 = new Date(0L);
        //获取时间原点毫秒值
        long time = d1.getTime();
        //在这个毫秒值基础上加一年(单位毫秒)
        time = time + 1000L * 60 * 60 * 24 * 365;//注:不加L会导致运算出错,因为后面这些数字会超出int的范围
        //将这个毫秒值返回最初的时间原点对象
        d1.setTime(time);
        System.out.println("需求1结果:");
        System.out.println(d1);

        //需求2:定义任意两个Date对象,比较一下哪个时间在前,哪个时间在后
        Random r = new Random();
        //创建两个Date对象,通过循环随机获取时间原点后任意毫秒的时间,并使用Math.abs()来取绝对值保证为正数
        Date d2 = new Date(Math.abs(r.nextLong()));
        Date d3 = new Date(Math.abs(r.nextLong()));
        //获取两个对象距离时间原点的毫秒值
        long time1 = d2.getTime();
        long time2 = d3.getTime();
        //比较并输出结果
        System.out.println("需求2结果:");
        System.out.println("第一个时间为:" + d2);
        System.out.println("第二个时间为:" + d3);
        if(time1 > time2) {
            System.out.println("第一个时间在后面,第二个时间在前面");
        } else if (time1 < time2) {
            System.out.println("第一个时间在前面,第二个时间在后面");
        } else {
            System.out.println("两个时间一样");
        }

    }
}
运行结果:

2.SimpleDateFormat方法:

构造方法与成员方法(格式化与解析):

        格式化为将日记对象转换成字符串,解析为将字符串转换成日记对象

代码:
public class Demo2 {
    public static void main(String[] args) throws ParseException {
        //格式化
        System.out.println("------------------格式化------------------");
        //1.利用空参构造创建SimpleDateFormat对象,默认格式
        SimpleDateFormat sdf1 = new SimpleDateFormat();
        Date d1 = new Date(0L);
        String format1 = sdf1.format(d1);
        System.out.println(format1);

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

        //2.利用带参构造创建SimpleDateFormat对象,指定格式
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String format2 = sdf2.format(d1);
        System.out.println(format2);

        //解析
        System.out.println("------------------解析------------------");
        //定义一个字符串表示时间
        String str = "2000-01-01 01:01:01";
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf3.parse(str);
        System.out.println(date);
        //转换之后就可以再使用Date的方法获取距离时间原点的时间了
        long time = date.getTime();
        System.out.println(time);

    }
}

代码中y M d H m s,分别表示年 月 日 小时 分钟 秒,一个字母代表一位,它们是方法中定义好的

方法中定义了以下模式字母:

运行结果:

练习一:

        假设,出生年月日为:2003-09-01

        请用字符串表示这个数据,并将其转换为:2003年9月1日

代码:
public class Test2 {
    public static void main(String[] args) throws ParseException {
        String birth = "2003-09-01";
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        Date d1= sdf1.parse(birth);
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
        String result = sdf2.format(d1);
        System.out.println(result);
    }
}
运行结果:

练习二:

        有一个秒杀活动,开始时间为:2024年11月11日 0:0:0

                                     结束时间为:2024年11月11日 0:10:0

        person1下单时间为:2024年11月11日 0:01:00

        person2下单时间为:2024年11月11日 0:11:00

用代码说明ta们有没有参加成功:

代码:
public class Test3 {
    public static void main(String[] args) throws ParseException {
        //定义字符串存储开始结束时间和小黑小白的下单时间
        String startStr = "2024年11月11日 0:0:0";
        String endStr = "2024年11月11日 0:10:0";
        String person1OrderStr = "2024年11月11日 0:01:0";
        String person2OrderStr = "2024年11月11日 0:11:0";

        //创建SimpleDateFormat
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

        //将字符串解析成Date类
        Date startDate = sdf.parse(startStr);
        Date endDate = sdf.parse(endStr);
        Date person1OrderDate = sdf.parse(person1OrderStr);
        Date person2OrderDate = sdf.parse(person2OrderStr);

        //利用Date类方法求出距离时间原点的毫秒值
        Long startTime = startDate.getTime();
        Long endTime = endDate.getTime();
        Long person1OrderTime = person1OrderDate.getTime();
        Long person2OrderTime = person2OrderDate.getTime();

        //进行比较
        if(person1OrderTime >= startTime && person1OrderTime <= endTime) {
            System.out.println("person1秒杀成功");
        } else {
            System.out.println("person1秒杀失败");
        }
        if(person2OrderTime >= startTime && person2OrderTime <= endTime) {
            System.out.println("person2秒杀成功");
        } else {
            System.out.println("person2秒杀失败");
        }

    }
}
运行结果:

3.Calendar:

        这个类表示一个时间的日历对象

常用方法:

public static Calendar getInstance()        获取当前时间的日历对象

public final Date getTime()                 获取日期对象
public final setTime(Date date)             给日历设置日期对象

public long getTimeInMillis()               拿到时间毫秒值
public void setTimeInMillis(long millis)    给日历设置时间毫秒值

public int get(int field)                   取日期中的某个字段信息
public void set(int field,int value)        修改日历的某个字段信息
public void add(int field,int amount)       为某个字段增加/减少指定的值
代码演示:
public class Test4 {
    public static void main(String[] args) throws ParseException {
        /*
        public static Calendar getInstance()        获取当前时间的日历对象

        public final Date getTime()                 获取日期对象
        public final setTime(Date date)             给日历设置日期对象

        public long getTimeInMillis()               拿到时间毫秒值
        public void setTimeInMillis(long millis)    给日历设置时间毫秒值

        public int get(int field)                   取日期中的某个字段信息
        public void set(int field,int value)        修改日历的某个字段信息
        public void add(int field,int amount)       为某个字段增加/减少指定的值
         */

        //创建日历对象
        Calendar c = Calendar.getInstance();
        System.out.println(c);
        //获取日期对象
        Date d1 = c.getTime();
        //给日历设置日期对象
        String timeStr = "2024-4-6";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d2 = sdf.parse(timeStr);
        c.setTime(d2);
        System.out.println(c);
        //拿到时间毫秒值
        long timeInMillis1 = c.getTimeInMillis();
        System.out.println(timeInMillis1);
        //给日历设置时间毫秒值
        c.setTimeInMillis(10000);
        timeInMillis1 = c.getTimeInMillis();
        System.out.println(timeInMillis1);

        //取日期中的某个字段信息
        //给日历对象c存储上日期2024-4-6
        c.setTime(d2);
        System.out.println(c);
        int year = c.get(Calendar.YEAR);
        //注意:月份字段范围为0~11,实际上的月份为当前的值+1,比如0表示1月,3表示4月,所以月份+1
        int month = c.get(Calendar.MONTH) + 1;
        int date = c.get(Calendar.DAY_OF_MONTH);
        //注意:外国认为星期日是第一天,星期一是第二天,星期二第三天,以此类推,所以创建一个方法来让输出结果符合中国人的阅读习惯
        int week = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(year + ", " + month + ", " + date + ", " + getWeek(week));
    }

    public static String getWeek(int index) {
        String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
        return arr[index];
    }
}
运行结果:

这是日历中年月日所在字段

二,JDK8时间:

1.Date类方法:

(1)zoneId时区:
代码演示:
public class Demo1 {
    public static void main(String[] args) {
        //获取所有的时区名称  一共有600个
        Set<String> zoneIds = ZoneId.getAvailableZoneIds();
        System.out.println(zoneIds);

        //获取当前系统的默认时区
        ZoneId zoneId = ZoneId.systemDefault();
        System.out.println(zoneId);

        //获取指定的时区
        ZoneId zoneId1 = ZoneId.of("Asia/Taipei");
        System.out.println(zoneId1);
    }
}
运行结果:

(2)Instant时间戳:
代码演示:
public class Demo2 {
    public static void main(String[] args) {
        //1.获取当前时间的Instant对象(标准时间)
        System.out.println("----------1----------");
        Instant now = Instant.now();
        System.out.println(now);

        //2.根据(秒/毫秒/纳秒)获取Instant对象
        System.out.println("----------2----------");
        Instant instant1 = Instant.ofEpochMilli(1000L);//单位为毫秒
        System.out.println(instant1);
        Instant instant2 = Instant.ofEpochSecond(1L);//单位为秒
        System.out.println(instant2);
        Instant instant3 = Instant.ofEpochSecond(0L,1000000000);//参数为秒和纳秒
        System.out.println(instant3);

        //3.指定时区
        System.out.println("----------3----------");
        ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("Asia/Shanghai"));
        System.out.println(zonedDateTime);

        //4.isXxx 判断  isBefore isAfter
        System.out.println("----------4----------");
        Instant instant4 = Instant.ofEpochMilli(0L);
        Instant instant5 = Instant.ofEpochMilli(1000L);
        boolean result1 = instant4.isAfter(instant5);
        System.out.println(result1);
        boolean result2 = instant4.isBefore(instant5);
        System.out.println(result2);

        //5.minusXxx  减少时间系列的方法
        System.out.println("----------5----------");
        Instant instant6 = Instant.ofEpochMilli(1000L);
        System.out.println(instant6);
        Instant instant7 = instant6.minusMillis(1000L);
        System.out.println(instant7);

        //6.plusXxx   增加时间系列的方法
        System.out.println("----------6----------");
        Instant instant8 = Instant.ofEpochMilli(1000L);
        System.out.println(instant8);
        Instant instant9 = instant8.plusMillis(1000L);
        System.out.println(instant9);

    }
}
运行结果:

(3)ZoneDateTime:
代码演示:
public class Demo3 {
    public static void main(String[] args) {
        //1.获取当前时间对象(带时区)
        System.out.println("----------1----------");
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println(now);

        //2.获取指定的时间对象(带时区)
        //年月日时分秒纳秒方式指定
        System.out.println("----------2----------");
        ZonedDateTime time1 = ZonedDateTime.of(2024,4,7,
                12,0,0,0, ZoneId.of("Asia/Shanghai"));
        System.out.println(time1);

        //通过Instant + 时区的方式指定获取事件对象
        Instant instant = Instant.ofEpochMilli(0L);
        ZoneId zoneId = ZoneId.of("Asia/Shanghai");
        ZonedDateTime time2 = ZonedDateTime.ofInstant(instant,zoneId);
        System.out.println(time2);

        //3.withXxx 修改时间系列的方法
        System.out.println("----------3----------");
        ZonedDateTime time3 = time2.withYear(2000);
        System.out.println(time3);

        //4.minusXxx 减少时间系列的方法
        System.out.println("----------4----------");
        ZonedDateTime time4 = time3.minusDays(365);
        System.out.println(time4);

        //5.plusXxx 增加时间系列的方法
        System.out.println("----------5----------");
        ZonedDateTime time5 = time3.plusMinutes(60);
        System.out.println(time5);

    }
}
运行结果:

2.日期格式化类(SimpleDateFormat):

DateTimeFormater:
代码演示:
public class Demo4 {
    public static void main(String[] args) {
        //创建事件对象
        ZonedDateTime now = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
        //创建解析/格式化器
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EE a");
        //格式化
        System.out.println(dtf1.format(now));

    }
}
运行结果:

3.日历类(Calendar):

LocalDateTime(包含LocalDate和LocalTime):
代码演示:
public class Demo5 {
    public static void main(String[] args) {
        //获取本地时间的日历对象
        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println(ldt1);
        int year = ldt1.getYear();
        int month = ldt1.getMonthValue();
        int date = ldt1.getDayOfMonth();
        int hour = ldt1.getHour();
        int minute = ldt1.getMinute();
        int second = ldt1.getSecond();
        System.out.println(year + ", " + month + ", " +  date + ", " + hour + ", " + minute + ", " + second);

        //isXxx 判断
        LocalDateTime ldt2 = LocalDateTime.of(2000,12,12,0,0);
        boolean result1 = ldt1.isAfter(ldt2);
        boolean result2 = ldt1.isBefore(ldt2);
        System.out.println(result1);
        System.out.println(result2);

        //withXxx 修改
        LocalDateTime ldt3 = ldt2.withYear(2024);
        System.out.println(ldt3);

        //minusXxx 减少
        LocalDateTime ldt4 = ldt2.minusYears(1000);
        System.out.println(ldt4);

        //plusXxx 增加
        LocalDateTime ldt5 = ldt2.plusYears(1000);
        System.out.println(ldt5);

        //还可以将LocalDateTime类转换成LocalDate类和LocalTime类
        //前者只有年月日,后者只有时分秒,方法和本类一致,可套用
        //转换方法:
        LocalDate localDate = ldt5.toLocalDate();
        System.out.println(localDate);
        LocalTime localTime = ldt5.toLocalTime();
        System.out.println(localTime);
    }
}
运行结果:

4.工具类:

ChronoUnit:
代码演示:
public class Demo6 {
    public static void main(String[] args) {
        //创建当前时间的日历对象
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);

        //创建某一天的日历对象
        LocalDateTime someday = LocalDateTime.of(2000,1,1,1,11);
        System.out.println(someday);

        System.out.println("相差的年数:" + ChronoUnit.YEARS.between(someday,today));
        System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(someday,today));
        System.out.println("相差的天数:" + ChronoUnit.DAYS.between(someday,today));
        System.out.println("相差的时数:" + ChronoUnit.HOURS.between(someday,today));
        System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(someday,today));
        System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(someday,today));
    }
}
运行结果:

  • 34
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值