Java温故而知新-日期时间

107 篇文章 1 订阅


Date类

System.out.println(new Date());

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Date实例化与日期比较

import java.util.Date;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        long datetime = System.currentTimeMillis() - 10000 ;    // 得到了一个long数据类型
        Date dateA = new Date(datetime) ; // 日期时间数值要小
        Date dateB = new Date() ;   // 日期时间数值要大
        System.out.println(dateA); // long转为Date类型
        System.out.println(dateB);
        System.out.println("【两个日期之间所差的毫秒数】" + (dateB.getTime() - dateA.getTime()));
        System.out.println("【先后关系】AFTER:" + (dateA.after(dateB)));
        System.out.println("【先后关系】BEFORE:" + (dateA.before(dateB)));
    }
}

Calendar

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

范例:获取当前日期时间

package com.yootk.demo;

import java.util.Calendar;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        Calendar calendar = Calendar.getInstance(); // 获取对象实例
        System.out.println(String.format("当前的日期时间格式:%s-%s-%s %s:%s:%s",
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH) + 1,
                calendar.get(Calendar.DAY_OF_MONTH),
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                calendar.get(Calendar.SECOND)));
    }
}

在这里插入图片描述

范例:日期计算

import java.util.Calendar;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        Calendar calendar = Calendar.getInstance(); // 获取对象实例
        calendar.add(Calendar.YEAR, 30); // 30年之后
        calendar.add(Calendar.MONTH, 6); // 计算半年之后的日期
        System.out.println(String.format("当前的日期时间格式:%s-%s-%s %s:%s:%s",
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH) + 1,
                calendar.get(Calendar.DAY_OF_MONTH),
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                calendar.get(Calendar.SECOND)));
    }
}

在这里插入图片描述

范例:找到8月的最后一天

import java.util.Calendar;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        Calendar calendar = Calendar.getInstance(); // 获取对象实例
        calendar.set(calendar.get(Calendar.YEAR), 8, 1); // 通过9月计算8月最后一天
        calendar.add(Calendar.DATE, -1); // 9月的第一天减1
        System.out.println(String.format("当前的日期时间格式:%s-%s-%s %s:%s:%s",
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH) + 1,
                calendar.get(Calendar.DAY_OF_MONTH),
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                calendar.get(Calendar.SECOND)));
    }
}

在这里插入图片描述

SimpleDateFormat

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

范例:日期格式化yyyy-MM-dd HH:mm:ss.SSS

import java.text.SimpleDateFormat;
import java.util.Date;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        Date date = new Date() ;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ; // 实例化转换类对象
        String str = sdf.format(date) ; // 将日期时间转为字符串
        System.out.println(str);
    }
}

范例:字符串转日期时间(String ➡️ Date)

package com.yootk.demo;

import java.text.SimpleDateFormat;
import java.util.Date;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        String str = "2020-02-16 15:54:36.873" ; // 所给出的日期时间字符串的组成要求符合于匹配结构
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ; // 实例化转换类对象
        Date date = sdf.parse(str) ; // 将字符串转为日期时间
        System.out.println(date);
    }
}

数据类型转换表

在这里插入图片描述

LocalDate

在这里插入图片描述

范例:获取当年的日期时间

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        LocalDate localDate = LocalDate.now() ; // 获得当前的日期
        LocalTime localTime = LocalTime.now() ; // 获得当前的时间
        LocalDateTime localDateTime = LocalDateTime.now() ; // 获得当前的日期时间
        System.out.println("【LocalDate实例化对象输出】" + localDate);
        System.out.println("【LocalTime实例化对象输出】" + localTime);
        System.out.println("【LocalDateTime实例化对象输出】" + localDateTime);
    }
}

范例:通过LocalDate获取详细的日期数据

import java.time.LocalDate;
import java.time.temporal.ChronoField;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        LocalDate today = LocalDate.now(); // 获得当前的日期
        System.out.println(String.format("【当前日期】%s-%s-%s", today.getYear(), today.getMonthValue(), today.getDayOfMonth()));
        System.out.println("【获取一周时间数】" + today.getDayOfWeek().getValue());
        System.out.println("【今天所处一月的周数】" + today.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
        System.out.println("【今天所处一年的周数】" + today.get(ChronoField.ALIGNED_WEEK_OF_YEAR));
        System.out.println("【今天所处一年的第几天】" + today.getDayOfYear());
    }
}

范例:判断是否是闰年

import java.time.LocalDate;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        LocalDate localDate = LocalDate.parse("1988-09-15") ; // 操作特定日期
        System.out.println("【闰年判断】" + localDate.isLeapYear());
        System.out.println("【所处的一周时间数】" + localDate.getDayOfWeek());
    }
}

范例:日期的推算


import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        LocalDate localDate = LocalDate.parse("1988-09-15"); // 操作特定日期
        System.out.println("【所在月的第一天】" + localDate.with(TemporalAdjusters.firstDayOfMonth()));
        System.out.println("【所在月的第二天】" + localDate.withDayOfMonth(2));
        System.out.println("【所在月的最后一天】" + localDate.with(TemporalAdjusters.lastDayOfMonth()));
        System.out.println("【300年后的日期】" + localDate.plusYears(300));
        System.out.println("【300月后的日期】" + localDate.plusMonths(300));
        System.out.println("【日期所处月的第一个周一】" + localDate.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
        System.out.println("【日期所处年的第一个周一】" + LocalDate.parse("1988-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
    }
}

多线程中日期格式化

方式一:性能差,容易产生垃圾

package com.yootk.demo;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                try {   // 单一线程下的实现的字符串转日期处理
                    System.out.println("【" + Thread.currentThread().getName() + "】" + sdf.parse("1998-02-17 21:15:32"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }, "SDF转换线程 - " + x).start();
        }
    }
}

不会出现任何错误,但是SimpleDateFormat sdf 重复了,会导致垃圾的产生。

方式二:多线程会报错

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        // 日期时间的格式化类对象,定义SimpleDateFormat类中的匹配日期时间字符串
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") ;
        ZoneId zoneId = ZoneId.systemDefault() ; // 获得当前的时区ID
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                LocalDateTime localDateTime = LocalDateTime.parse("1998-02-17 21:15:32", formatter) ;
                Instant instant = localDateTime.atZone(zoneId).toInstant();// 获得一个当前时区的实例
                Date date = Date.from(instant) ; // 字符串转为日期
                System.out.println("【" + Thread.currentThread().getName() + "】" + date);
            }, "SDF转换线程 - " + x).start();
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方式三:DateTimeFormatter(多线程下推荐)

日期时间:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        // 日期时间的格式化类对象,定义SimpleDateFormat类中的匹配日期时间字符串
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") ;
        ZoneId zoneId = ZoneId.systemDefault() ; // 获得当前的时区ID
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                LocalDateTime localDateTime = LocalDateTime.parse("1998-02-17 21:15:32", formatter) ;
                Instant instant = localDateTime.atZone(zoneId).toInstant();// 获得一个当前时区的实例
                Date date = Date.from(instant) ; // 字符串转为日期
                System.out.println("【" + Thread.currentThread().getName() + "】" + date);
            }, "SDF转换线程 - " + x).start();
        }
    }
}

日期:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class YootkDemo {    // 李兴华编程训练营:yootk.ke.qq.com
    public static void main(String[] args) throws Exception {
        // 日期时间的格式化类对象,定义SimpleDateFormat类中的匹配日期时间字符串
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") ;
        ZoneId zoneId = ZoneId.systemDefault() ; // 获得当前的时区ID
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                LocalDate localDate = LocalDate.parse("1998-02-17", formatter) ;
                Instant instant = localDate.atStartOfDay().atZone(zoneId).toInstant() ; // 获取当前时区实例
                Date date = Date.from(instant) ; // 字符串转为日期
                System.out.println("【" + Thread.currentThread().getName() + "】" + date);
            }, "SDF转换线程 - " + x).start();
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值