Java时间(包括1.8之前和1.8之后)

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

public class DateSimpleTest {

1.8以前

Date 日期



    /**
     * Date常用方法
     * 

* 获取时间 时间-><-时间戳 */ @Test public void test1() { //获取系统当前时间 Date date1 = new Date(); System.out.println("date = " + date1); //获取时间的时间戳 long time = date1.getTime(); //加3秒后的时间值 time += 3 * 1000; Date date2 = new Date(time); System.out.println("date2 = " + date2); //把时间戳转换为时间 Date date3 = new Date(); date3.setTime(time); System.out.println("date3 = " + date3); }

SimpleDateFormat 简单日期格式化

    /**
     * SimpleDateFormat 常用方法
     * 

* 日期->文本 文本->时间 */ @Test public void test2() throws ParseException { //日期->文本 Date date = new Date(); long time = date.getTime(); System.out.println("time = " + time); //格式化时间对象 和时间毫秒值 EEE表示周几 a表示上午或下午 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a"); String format = sdf.format(date); System.out.println("format = " + format); //时间戳转文本 String format1 = sdf.format(time); System.out.println("format1 = " + format1); //文本->时间 String dateStr = "2023年9月11日 14:09:12"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date parse = simpleDateFormat.parse(dateStr); System.out.println("parse = " + parse); }

Date 和 SimpleDateFormat综合测试


    /**
     * Date和SimpleDateFormat综合测试
     * 

* 测试秒杀活动时间 * * @throws ParseException */ @Test public void test3() throws ParseException { //小贾的参加时间 2023年11月11日 0:01:18 参加成功 String xj = "2023年11月11日 0:01:18"; System.out.println("小贾是否成功参加 = " + whetherToParticipate(xj)); //小皮的参加时间 2023年11月11日 0:10:51 参加失败 String xp = "2023年11月11日 0:10:51"; System.out.println("小皮是否成功参加 = " + whetherToParticipate(xp)); } /** * 判断是否参加上了秒杀活动 *

秒杀开始时间 2023年11月11日 00:00:00 *

秒杀结束时间 2023年11月11日 00:10:00 */ public static String whetherToParticipate(String dateStr) throws ParseException { //格式化 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //开始时间 String startDateStr = "2023年11月11日 00:00:00"; Date startDate = simpleDateFormat.parse(startDateStr); //结束时间 Date endDate = new Date(startDate.getTime() + 600 * 1000); //参加时间 Date timeOfParticipation = simpleDateFormat.parse(dateStr); //获取时间戳 并比较 long startDateTime = startDate.getTime(); long endDateTime = endDate.getTime(); long timeDateOfIn = timeOfParticipation.getTime(); return timeDateOfIn >= startDateTime && timeDateOfIn <= endDateTime ? "参加成功" : "参加失败"; }

Calendar 日历

    

    /**
     * Calendar 代表当前系统此刻对应的日历
     * 可以单独获取与修改时间中的 年 月 日 时 分 秒
     */
    @Test
    public void test4() {

        //获取日历对象
        Calendar calendar = Calendar.getInstance();
        System.out.println("某月的第几天 = " + calendar.get(Calendar.DATE));
        System.out.println("某月的第几天 = " + calendar.get(Calendar.DAY_OF_MONTH));
        System.out.println("某年的第几天 = " + calendar.get(Calendar.DAY_OF_YEAR));
        System.out.println("某月中第几周 1号起就是第1周,8号起就是第2周 = " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
        System.out.println("某周的第几天 = " + calendar.get(Calendar.DAY_OF_WEEK));
        System.out.println("某天的第几个小时 = " + calendar.get(Calendar.HOUR_OF_DAY));
        System.out.println("日历中的年 = " + calendar.get(Calendar.YEAR));


        //获取时间
        Date time = calendar.getTime();

        //获取时间戳
        long timeInMillis = calendar.getTimeInMillis();

        //设置年
        calendar.set(Calendar.YEAR, 2022);
        System.out.println("设置为2022年 = " + calendar.getTime());

        //设置日期
        calendar.set(Calendar.DATE, 2);
        System.out.println("设置为一个月的2号 = " + calendar.getTime());

        //加1年
        calendar.add(Calendar.YEAR, 1);
        System.out.println("加1年 = " + calendar.getTime());

        //减3年
        calendar.add(Calendar.YEAR, -3);
        System.out.println("减3年 = " + calendar.getTime());
    }

1.8及以后

LocalDate 年 月 日


    /**
     * LocalDate  年 月 日
     */
    @Test
    public void test5() {

        System.out.println("-------------获取年月日信息 get--------------");
        //获取本地日期信息
        LocalDate now = LocalDate.now();
        System.out.println("当前日期 = " + now);
        System.out.println("获取年 = " + now.getYear());
        System.out.println("获取月 = " + now.getMonthValue());
        System.out.println("获取日 = " + now.getDayOfMonth());
        System.out.println("获取一年中的第几天 = " + now.getDayOfYear());
        System.out.println("获取周几 = " + now.getDayOfWeek().getValue());


        System.out.println("-------------修改日期信息 with--------------");
        LocalDate now1 = LocalDate.now();
        System.out.println("当前日期 = " + now1);
        System.out.println("修改为2020年 = " + now1.withYear(2020));
        System.out.println("修改为1月 = " + now1.withMonth(1));
        System.out.println("修改为1号 = " + now1.withDayOfMonth(1));
        System.out.println("修改为一年中的第365天 = " + now1.withDayOfYear(365));


        System.out.println("-------------对日期信息加多少 plus--------------");
        LocalDate now2 = LocalDate.now();
        System.out.println("当前日期 = " + now2);
        System.out.println("加一年 = " + now2.plusYears(1));
        System.out.println("加一月" + now2.plusMonths(1));
        System.out.println("加一周" + now2.plusWeeks(1));
        System.out.println("加一天" + now2.plusDays(1));


        System.out.println("-------------对日期信息减多少 minus--------------");
        LocalDate now3 = LocalDate.now();
        System.out.println("当前日期 = " + now3);
        System.out.println("减一年" + now3.minusYears(1));
        System.out.println("减一个月" + now3.minusMonths(1));
        System.out.println("减一周" + now3.minusWeeks(1));
        System.out.println("减一天" + now3.minusDays(1));


        System.out.println("-------------获取指定日期的LocalDate对象 of--------------");
        LocalDate of = LocalDate.of(2021, 11, 11);
        System.out.println("指定日期 = " + of);


        System.out.println("-------------判断两个日期大小 is--------------");
        LocalDate of1 = LocalDate.of(2020, 11, 11);
        LocalDate of2 = LocalDate.of(2019, 11, 11);
        //false
        System.out.println("of1与of2是否相等? = " + of1.isEqual(of2));
        //false
        System.out.println("of1在of2之前? = " + of1.isBefore(of2));
        //true
        System.out.println("of1在of2之后? = " + of1.isAfter(of2));
    }

LocalTime 时 分 秒 纳秒


    /**
     * LocalTime  时 分 秒  纳秒
     */
    @Test
    public void test6() {

        System.out.println("-------------获取 时 分 秒 毫秒 纳秒信息 get--------------");
        //获取本地时间信息
        LocalTime now = LocalTime.now();
        System.out.println("当前时间 = " + now);
        System.out.println("获取时 = " + now.getHour());
        System.out.println("获取分 = " + now.getMinute());
        System.out.println("获取秒 = " + now.getSecond());
        System.out.println("获取纳秒 = " + now.getNano());


        System.out.println("-------------修改时间信息 with--------------");
        LocalTime now1 = LocalTime.now();
        System.out.println("当前时间 = " + now1);
        System.out.println("修改为13时 = " + now1.withHour(13));
        System.out.println("修改为5分 = " + now1.withMinute(5));
        System.out.println("修改为12秒 = " + now1.withSecond(12));
        System.out.println("修改为1000纳秒 = " + now1.withNano(1000));


        System.out.println("-------------对时间信息加多少 plus--------------");
        LocalTime now2 = LocalTime.now();
        System.out.println("当前时间 = " + now2);
        System.out.println("加一时 = " + now2.plusHours(1));
        System.out.println("加一分" + now2.plusMinutes(1));
        System.out.println("加一秒" + now2.plusSeconds(1));
        System.out.println("加100纳秒" + now2.plusNanos(100));


        System.out.println("-------------对时间信息减多少 minus--------------");
        LocalTime now3 = LocalTime.now();
        System.out.println("当前时间 = " + now3);
        System.out.println("减一时" + now3.minusHours(1));
        System.out.println("减一分钟" + now3.minusMinutes(1));
        System.out.println("减一秒" + now3.minusSeconds(1));
        System.out.println("减100毫秒" + now3.minusNanos(100));


        System.out.println("-------------获取指定时间的LocalDate对象 of--------------");
        LocalTime of = LocalTime.of(12, 11, 11, 1000);
        System.out.println("指定时间 = " + of);


        System.out.println("-------------判断两个时间大小 is--------------");
        LocalTime of1 = LocalTime.of(12, 11, 11);
        LocalTime of2 = LocalTime.of(11, 11, 11);
        //false
        System.out.println("of1与of2是否相等? = " + of1.equals(of2));
        //false
        System.out.println("of1在of2之前? = " + of1.isBefore(of2));
        //true
        System.out.println("of1在of2之后? = " + of1.isAfter(of2));
    }

LocalDateTime 年 月 日 时 分 秒 纳秒


    /**
     * LocalDateTime 年 月 日 时 分 秒 纳秒
     */
    @Test
    public void test7() {
        System.out.println("-------------获取时间日期 get--------------");
        LocalDateTime now = LocalDateTime.now();
        System.out.println("当前日期时间 = " + now);
        System.out.println("获取年 = " + now.getYear());
        System.out.println("获取月 = " + now.getMonth().getValue());
        System.out.println("获取月 = " + now.getMonthValue());
        System.out.println("获取一年中的第几天 = " + now.getDayOfYear());
        System.out.println("获取几号 = " + now.getDayOfMonth());
        System.out.println("获取周几 = " + now.getDayOfWeek().getValue());
        System.out.println("获取小时 = " + now.getHour());
        System.out.println("获取分 = " + now.getMinute());
        System.out.println("获取秒 = " + now.getSecond());
        System.out.println("获取纳秒 = " + now.getNano());

        System.out.println("-------------修改时间信息 with--------------");
        System.out.println("now.withYear(2002) = " + now.withYear(2002));
        System.out.println("now.withMonth(2) = " + now.withMonth(2));


        System.out.println("-------------时间信息加多少 plus--------------");
        System.out.println("now.plusYears(1) = " + now.plusYears(1));

        System.out.println("-------------时间信息减多少 minus--------------");
        System.out.println("now.minusYears(1) = " + now.minusYears(1));


        System.out.println("-------------获取指定时间信息 of--------------");
        LocalDateTime of1 = LocalDateTime.of(2022, 12, 12, 12, 12, 12, 10000);
        LocalDateTime of2 = LocalDateTime.of(2021, 11, 11, 11, 12, 12, 10000);
        System.out.println("of1 = " + of1);
        System.out.println("of2 = " + of2);


        System.out.println("-------------比较时间信息 is--------------");
        System.out.println("of1与of2相等? = " + of1.isEqual(of2));
        System.out.println("of1在of2之前? = " + of1.isBefore(of2));
        System.out.println("of1在of2之后? = " + of1.isBefore(of2));


        System.out.println("-------------把时间信息转换成LocalDate to--------------");
        System.out.println("now.toLocalDate() = " + now.toLocalDate());

        System.out.println("-------------把时间信息转换成LocalTime to--------------");
        System.out.println("now.toLocalTime() = " + now.toLocalTime());

        System.out.println("-------------LocalDate 和 LocalTime 合成一个LocalDateTime--------------");
        LocalDate localDate = now.toLocalDate();
        LocalTime localTime = now.toLocalTime();
        LocalDateTime of = LocalDateTime.of(localDate, localTime);
        System.out.println("合成的LocalDateTime = " + of);
    }

ZoneId 时区


    /**
     * ZoneId 时区
     */
    @Test
    public void test8() {
        // 世界各国与各地区的经度不同,各地区的时间也不同,因此会划分为不同的时区 全世界总共有24个时区
        // 0时区(是本初子午线对应的位置)时间被称为 世界标准时间(UTC)
        // 中国标准时间 = 世界标准时间(UTC) + 8 小时

        //ZoneId 代表时区Id
        //为了方便记忆,通常会用一个时区里的标志性城市代表这个时区 格式:州名/城市名 或者是 国家名/城市名
        //我国的ZoneId 可以使用 Asia/Shanghai Asia/Beijing Asia/Chongqing
        //美国的ZoneId 可以使用 America/New_York

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

        System.out.println("-------------获取一个指定时区--------------");
        ZoneId zoneId = ZoneId.of("America/New_York");
        System.out.println("纽约的ZoneId = " + zoneId);

        System.out.println("-------------获取Java支持的所有时区ID--------------");
        System.out.println("所有时区ID = " + ZoneId.getAvailableZoneIds());

    }

ZonedDateTime 带时区的时间

    /**
     * ZonedDateTime 带时区的时间
     */
    @Test
    public void test9() {

        System.out.println("-------------获取系统的默认时区的ZonedDateTime对象--------------");
        ZonedDateTime now1 = ZonedDateTime.now();
        System.out.println("now1 = " + now1);

        System.out.println("-------------获取指定时区的ZonedDateTime对象--------------");
        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/New_York"));
        System.out.println("now = " + now);


        System.out.println("-------------获取世界标准时间--------------");
        ZonedDateTime now2 = ZonedDateTime.now(Clock.systemUTC());
        System.out.println("now2 = " + now2);

        //ZonedDateTime与LocalDateTime用法基本一致 包括 get with plus minus 等
    }

Instant 时间线上的某个时刻/时间戳

    /**
     * 代替Date
     * Instant:时间线上的某个时刻/时间戳
     * 通过获取Instant的对象可以拿到此刻的时间,该时间由两部分组成:从1970-01-01 00:00:00开始走到此刻的总秒数 + 不够1秒的纳秒数
     * 作用:可以用来记录代码的执行时间,或用于记录用户操作某个事件的时间点。
     * 传统的Date类,只能精确到毫秒,并且是可变对象;
     * 新增的Instant类,可以精确到纳秒,并且是不可变对象,推荐用Instant代替Date。
     */
    @Test
    public void test10() {
        System.out.println("-------------创建Instant对象,获取此刻的时间戳信息--------------");
        Instant now = Instant.now();
        System.out.println("now = " + now);

        System.out.println("-------------获取从1970-01-01T00: 80: 00开始记录的秒数--------------");
        System.out.println("总秒数 = " + now.getEpochSecond());

        System.out.println("-------------不够一秒的纳秒数--------------");
        System.out.println("纳秒数 = " + now.getNano());

        System.out.println("-------------增加时间 plus--------------");
        System.out.println("增加一秒 = " + now.plusSeconds(1));

        System.out.println("-------------减少时间 minus--------------");
        System.out.println("减少两万纳秒 = " + now.minusNanos(20000));

        System.out.println("-------------判断时间 is--------------");
        Instant now1 = Instant.now();
        System.out.println("now = " + now);
        System.out.println("now1 = " + now1);
        System.out.println("相等? = " + now.equals(now1));
        System.out.println("now在now1之前? = " + now.isBefore(now1));
        System.out.println("now在now1之后? = " + now.isAfter(now1));

    }

DateTimeFormatter 日期时间格式

    /**
     * 代替SimpleDateFormat(线程不安全)
     * DateTimeFormatter(线程安全) :用于时间的格式化和解析
     */
    @Test
    public void test11() {
        System.out.println("-------------获取格式化对象--------------");
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");

        System.out.println("-------------格式化时间 LocalDateTime--------------");
        LocalDateTime now = LocalDateTime.now();

        String format = dateTimeFormatter.format(now);
        System.out.println("格式化器做格式化 = " + format);

        String format1 = now.format(dateTimeFormatter);
        System.out.println("LocalDateTime自带的方法格式化 = " + format1);

        System.out.println("-------------格式化时间 ZonedDateTime--------------");
        ZonedDateTime now2 = ZonedDateTime.now();
        String format3 = dateTimeFormatter.format(now2);
        System.out.println("format2 = " + format3);

        System.out.println("-------------格式化时间 Instant 必须指定时区 否则报 UnsupportedTemporalTypeException 异常--------------");
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss").withZone(ZoneId.systemDefault());
        Instant now1 = Instant.now();
        String format2 = dateTimeFormatter1.format(now1);
        System.out.println("format1 = " + format2);


        System.out.println("-------------解析时间--------------");
        String dateStr = "2022年12月12日 12:12:12";
        LocalDateTime parse = LocalDateTime.parse(dateStr, dateTimeFormatter);
        System.out.println("解析后的时间 = " + parse);


    }
    

Period 日期间隔(年,月,日)

    /**
     * 其他补充
     * Period:日期间隔(年,月,日)
     * 可以用于计算两个LocalDate对象相差的年数、月数、天数。
     */
    @Test
    public void test12() {
        System.out.println("-------------计算年月日间隔--------------");
        LocalDate start = LocalDate.of(2024, 10, 1);
        LocalDate end = LocalDate.of(2024, 11, 15);
        Period between = Period.between(start, end);
        System.out.println("开始到结束总计月份 = " + between.toTotalMonths());
        System.out.println("间隔多少年 = " + between.getYears());
        System.out.println("间隔多少月 = " + between.getMonths());
        System.out.println("间隔多少天 = " + between.getDays());

//        System.out.println("获取单位 = " + between.getUnits());
//        System.out.println("间隔多少天2 = " + between.getChronology());
    }

Duration 时间间隔(时、分、秒,纳秒)

    /**
     * 其他补充
     * Duration:时间间隔(时、分、秒,纳秒)
     * 可以用于计算两个时间对象相差的天数、小时数、分数、秒数、纳秒数; 支持LocalTime、 LocalDateTime、Instant等时间。
     */
    @Test
    public void test13() {
        LocalDateTime start = LocalDateTime.of(2023,11,11,11,11,11,10000);
        LocalDateTime end = LocalDateTime.of(2023,11,11,11,12,11,100000);
        Duration between = Duration.between(start, end);

        System.out.println("间隔多少天 = " + between.toDays());
        System.out.println("间隔多少小时 = " + between.toHours());
        System.out.println("间隔多少分 = " + between.toMinutes());
        System.out.println("间隔多少秒 = " + between.toSeconds());
        System.out.println("间隔多少毫秒 = " + between.toMillis());
        System.out.println("间隔多少纳秒 = " + between.toNanos());

        System.out.println("间隔多少秒 = " + between.getSeconds());
        System.out.println("间隔多少纳秒 = " + between.getNano());
    }
}

你可能感兴趣的:(java,开发语言)