IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java线程安全的时间工具类LocalDateTime常用方法 -> 正文阅读

[Java知识库]Java线程安全的时间工具类LocalDateTime常用方法

前言

一般我们在操作日期相关方法时,都会使用SimpleDateFormat,但SimpleDateFormat是线程不安全的类,如果我们要定义为static则必须要加锁,才能保证线程安全,如果不定义为static,即每次在方法使用时自己new一个出来,这两种方式无论哪一种,都显得不太优雅。

JDK8之前我们通常借助ThreadLocal来实现,像如下这样:

private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { 
	@Override 
	protected DateFormat initialValue() { 
		return new SimpleDateFormat("yyyy-MM-dd"); 
	} 
}; 

JDK8新的时间类API

JDK8之后,我们可以使用LocalDateTime代替Calendar,DateTimeFormatter 代替SimpleDateFormat,Instant 代替Date,下面给出了一些常用的方法,以供参考


import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

public class DateUtil {

    private static final DateTimeFormatter DATE_TIME_FORMATTER_DAY = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final DateTimeFormatter DATE_TIME_FORMATTER_HOUR = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
    private static final DateTimeFormatter DATE_TIME_FORMATTER_MIN = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
    private static final DateTimeFormatter DATE_TIME_FORMATTER_SEC = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * data 转 LocalDate
     *
     * @param date date
     * @return LocalDate
     */
    public static LocalDate dateToLocalDate(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * data 转 LocalDateTime
     *
     * @param date date
     * @return LocalDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /**
     * localDateTime 转 Date
     *
     * @param localDateTime localDateTime
     * @return Date
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * localDate 转 Date
     *
     * @param localDate localDate
     * @return Date
     */
    public static Date localDateToDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 格式化【年-月-日】当前时间
     *
     * @return 2000-01-01
     */
    public static String formatNowOfDay() {
        return LocalDateTime.now().format(DATE_TIME_FORMATTER_DAY);
    }

    /**
     * 格式化【年-月-日 小时】当前时间
     *
     * @return 2000-01-01 08
     */
    public static String formatNowOfHour() {
        return LocalDateTime.now().format(DATE_TIME_FORMATTER_HOUR);
    }

    /**
     * 格式化【年-月-日 小时:分钟】当前时间
     *
     * @return 2000-01-01 08:00
     */
    public static String formatNowOfMin() {
        return LocalDateTime.now().format(DATE_TIME_FORMATTER_MIN);
    }

    /**
     * 格式化【年-月-日 小时:分钟:秒】当前时间
     *
     * @return 2000-01-01 08:00:00
     */
    public static String formatNowOfSec() {
        return LocalDateTime.now().format(DATE_TIME_FORMATTER_SEC);
    }

    /**
     * 计算两个时间相差的毫秒数
     *
     * @param start 【年-月-日 小时:分钟:秒】2000-01-01 08:00:00
     * @param end   【年-月-日 小时:分钟:秒】2000-01-01 08:00:02
     * @return 相差的毫秒数:2000
     */
    public static long diffMillis(String start, String end) {
        LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
        LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
        return Duration.between(startTime, endTime).toMillis();
    }

    /**
     * 计算两个时间相差的秒数
     *
     * @param start 【年-月-日 小时:分钟:秒】2000-01-01 08:00:00
     * @param end   【年-月-日 小时:分钟:秒】2000-01-01 08:00:02
     * @return 相差的秒数:2
     */
    public static long diffSec(String start, String end) {
        LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
        LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
        return Duration.between(startTime, endTime).toMillis() / 1000;
    }

    /**
     * 计算两个时间相差的分钟数
     *
     * @param start 【年-月-日 小时:分钟:秒】2000-01-01 08:00:00
     * @param end   【年-月-日 小时:分钟:秒】2000-01-01 08:01:00
     * @return 相差的分钟数:1
     */
    public static long diffMin(String start, String end) {
        LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
        LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
        return Duration.between(startTime, endTime).toMinutes();
    }

    /**
     * 计算两个时间相差的小时数
     *
     * @param start 【年-月-日 小时:分钟:秒】2000-01-01 08:00:00
     * @param end   【年-月-日 小时:分钟:秒】2000-01-01 09:00:00
     * @return 相差的小时数:1
     */
    public static long diffHour(String start, String end) {
        LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
        LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
        return Duration.between(startTime, endTime).toHours();
    }

    /**
     * 计算两个时间相差的天数
     *
     * @param start 【年-月-日 小时:分钟:秒】2000-01-01 08:00:00
     * @param end   【年-月-日 小时:分钟:秒】2000-01-03 08:00:00
     * @return 相差的天数:2
     */
    public static long diffDay(String start, String end) {
        LocalDateTime startTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER_SEC);
        LocalDateTime endTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER_SEC);
        return Duration.between(startTime, endTime).toDays();
    }

    /**
     * 让time时间减去指定的天数
     *
     * @param time 【年-月-日 小时:分钟:秒】2000-01-01 08:00:00
     * @param days 要减去的天数,当传入负数时,等于加上指定的天数
     * @return 减去后的时间
     */
    public static String minusDay(String time, int days) {
        return LocalDateTime.parse(time, DATE_TIME_FORMATTER_SEC).minus(days, ChronoUnit.DAYS).format(DATE_TIME_FORMATTER_SEC);
    }

    /**
     * 让time时间减去指定的小时数
     *
     * @param time 【年-月-日 小时:分钟:秒】2000-01-01 08:00:00
     * @param hours 要减去的小时数
     * @return 减去后的时间
     */
    public static String minusHours(String time, int hours) {
        return LocalDateTime.parse(time, DATE_TIME_FORMATTER_SEC).minus(hours, ChronoUnit.HOURS).format(DATE_TIME_FORMATTER_SEC);
    }

    /**
     * 让time时间减去指定的分钟数
     *
     * @param time 【年-月-日 小时:分钟:秒】2000-01-01 08:00:00
     * @param minutes 要减去的分钟数
     * @return 减去后的时间
     */
    public static String minusMin(String time, int minutes) {
        return LocalDateTime.parse(time, DATE_TIME_FORMATTER_SEC).minus(minutes, ChronoUnit.MINUTES).format(DATE_TIME_FORMATTER_SEC);
    }

    /**
     * 让time时间减去指定的秒数
     *
     * @param time 【年-月-日 小时:分钟:秒】2000-01-01 08:00:00
     * @param seconds 要减去的秒数
     * @return 减去后的时间
     */
    public static String minusSeconds(String time, int seconds) {
        return LocalDateTime.parse(time, DATE_TIME_FORMATTER_SEC).minus(seconds, ChronoUnit.SECONDS).format(DATE_TIME_FORMATTER_SEC);
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:36:16  更:2021-07-28 07:38:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 8:06:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码