JAVA 8 日期工具类

版权声明:我的 我的 都是我的 https://blog.csdn.net/sinat_21925975/article/details/86504257

主题描述

JAVA的日期时间一直比较混乱,本来以为joda会是巅峰,但是JAVA 8改变了我的思想.但是即便在JAVA 8面前,我们还是要梳理一些自己的工具方法.

JAVA中日期时间的历史

所属包 JDK版本
java.util.Date 1.0
java.sql.Date extends Date 1.0
java.util.calendar 1.0

其他的例如TimeStamp啊,SimpleDateFormat之类的就不一一列举了,如果有兴趣可以参见Single_Yam的博客: 深入理解Java常用类-----时间日期

但是即便这么多玩意,依旧不好用!终于joda站出来了
具体的可以参见它的官网信息.现在有了JAVA 8 出现了,可以看到joda的官网是的描述:

Joda-Time is the de facto standard date and time library for Java prior to Java SE 8. Users are now asked to migrate to java.time (JSR-310).

也就是说在JAVA 8 及以上,我们都不在需要joda了,少了一个库,感觉美滋滋

代码成果

下面就是基于JAVA 8 的LocalDateTime整理的工具类:

package com.hykj.sys.utils;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Locale;

/**
 * 基于  {@link java.time}的工具类
 *
 * @author weizj
 */
public class LocalDateTimeUtils {

    /**
     * 根据指定的格式来格式化一个日期<br/>
     * 本方法不会返回null<br/>
     * 格式化字符串中:<br/>
     * <p>y&nbsp;代表<b>年</b></p>
     * <p>M&nbsp;代表<b>月</b></p>
     * <p>d&nbsp;代表<b>日</b></p>
     * <p>h&nbsp;代表<b>十二进制的小时</b></p>
     * <p>H&nbsp;代表<b>二十四进制的小时</b></p>
     * <p>m&nbsp;代表<b>分钟</b></p>
     * <p>s&nbsp;代表<b>秒</b></p>
     * <p>f&nbsp;代表<b>毫秒</b></p>
     *
     * @param localDateTime 需要格式化的时间
     * @param pattern       格式化
     * @param locale        本地化
     * @return 格式化后的字符串
     */
    public static String format(LocalDateTime localDateTime, String pattern, Locale locale) {

        if (localDateTime == null || pattern == null || pattern.length() == 0) {
            return "";
        }

        return localDateTime.format(DateTimeFormatter.ofPattern(pattern, locale));
    }

    /**
     * 根据指定的格式来格式化一个日期<br/>
     * 本方法不会返回null<br/>
     * 格式化字符串中:<br/>
     * <p>y&nbsp;代表<b>年</b></p>
     * <p>m&nbsp;代表<b>月</b></p>
     * <p>d&nbsp;代表<b>日</b></p>
     * <p>h&nbsp;代表<b>十二进制的小时</b></p>
     * <p>H&nbsp;代表<b>二十四进制的小时</b></p>
     * <p>M&nbsp;代表<b>分钟</b></p>
     * <p>s&nbsp;代表<b>秒</b></p>
     * <p>f&nbsp;代表<b>毫秒</b></p>
     *
     * @param localDateTime 需要格式化的时间
     * @param pattern       格式化
     * @return 格式化后的字符串
     */
    public static String format(LocalDateTime localDateTime, String pattern) {
        return format(localDateTime, pattern, Locale.getDefault());
    }

    /**
     * 把日期格式化为"yyyy-MM-dd"的字符串
     *
     * @param localDateTime 需要格式化的日期
     * @return "yyyy-MM-dd"样式的字符串
     */
    public static String formatDate(LocalDateTime localDateTime) {
        return format(localDateTime, "yyyy-MM-dd");
    }

    /**
     * 把日期格式化为"yyyy-MM-dd HH:mm:ss"的字符串
     *
     * @param localDateTime 需要格式化的日期
     * @return "yyyy-MM-dd HH:mm:ss"样式的字符串
     */
    public static String formatDateTime(LocalDateTime localDateTime) {
        return format(localDateTime, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 把日期格式化为"HH:mm:ss"的字符串
     *
     * @param localDateTime 需要格式化的日期
     * @return "HH:mm:ss"样式的字符串
     */
    public static String formatTime(LocalDateTime localDateTime) {
        return format(localDateTime, "HH:mm:ss");
    }

    /**
     * 把其他类型转换为{@link java.time.LocalDateTime}类型<br/>
     * 本方法不会返回null,<b>当入参不在以下支持的类型列表中,会采用toString()准换为字符串后提供支持</b><br/>
     * 本方法支持以下类型<br/>
     * {@link java.sql.Date}<br/>
     * {@link java.util.Date}<br/>
     * {@link java.sql.Timestamp}<br/>
     * {@link java.lang.String}<br/>
     * 毫秒数的{@link java.lang.Long}<br/>
     *
     * @param obj 需要转换为LocalDateTime的对象
     * @return LocalDateTime对象
     */
    public static LocalDateTime parseToLocalDateTime(Object obj) {
        if (obj == null) {
            return LocalDateTime.now();
        }

        if (obj instanceof java.util.Date) {
            return ((java.util.Date) obj).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        }
        if (obj instanceof String) {
            return LocalDateTime.parse((String) obj);
        }
        if (obj instanceof java.lang.Long) {
            return LocalDateTime.ofInstant(Instant.ofEpochMilli((long) obj), ZoneId.systemDefault());
        }
        return parseToLocalDateTime(obj.toString());
    }

    /**
     * 获取到毫秒的时间戳
     *
     * @param localDateTime 时间
     * @return 毫秒的时间戳
     */
    public static long toMilli(LocalDateTime localDateTime) {
        return localDateTime.toInstant(ZoneOffset.of(ZoneOffset.systemDefault().getId())).toEpochMilli();
    }

    /**
     * 获取到秒的时间戳
     *
     * @param localDateTime 时间
     * @return 秒的时间戳
     */
    public static long toSecond(LocalDateTime localDateTime) {
        return localDateTime.toInstant(ZoneOffset.of(ZoneOffset.systemDefault().getId())).getEpochSecond();
    }

    /**
     * 获取月初
     *
     * @param localDateTime 日期时间
     * @return 指定日期的月初
     */
    public static LocalDateTime getMonthHeader(LocalDateTime localDateTime) {
        return localDateTime.with(TemporalAdjusters.firstDayOfMonth());
    }

    public static LocalDateTime getLastofMonth(LocalDateTime localDateTime) {
        return localDateTime.with(TemporalAdjusters.lastDayOfMonth());
    }

}

猜你喜欢

转载自blog.csdn.net/sinat_21925975/article/details/86504257