Java基础-时间日期[1]

java.util.Date

  1. 概述
      Date类实际上是对long值的封装,long值表示当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。可从构造函数看出来:

        public Date() {
            this(System.currentTimeMillis());
        }
        public Date(long date) {
            fastTime = date;
        }
    	//仅仅剩下该方法,其余方法都需要使用Calendar替代
    	public void setTime(long time) {
            fastTime = time;
            cdate = null;
        }
    
  2. 常用方法及问题

    1. new Date(2019,1,1)是相对于1970年1月1号的时间,即3919年1月1号,非常容易出问题。已丢弃
    2. Date对象保存的是UTC的时间戳,但是在调用toString ()方法是却会调用TimeZone.getDefaultRef()以显示当前时区的时间
    3. new Date()可以通过调用setTime(),改变时间。线程不安全
    4. 没有提供日期加减操作,比如时间加7天或一个月等,必须通过setTime()手动加上时间间隔的毫秒数
    5. 只提供简单的时间比较方法,before(),after() ,compareTo()。实际上就是毫秒数的大小比价
    6. toString()输出结果不直观Fri Dec 27 10:14:50 CST,需调用new SimpleDateFormat("YYYY-MM-dd HH:mm:ss")格式化输出,而SimpleDateFormat里面由于需要维护Calendar对象,导致线程不安全。
      自己封装的java相关可能使用的方法
/**
 * @author froggengo@qq.com
 * @date 2021/4/13 20:42.
 * 主要时java.util.Date的封装。
 * Date对象包含的唯一东西是从1970年1月1日00:00:00 UTC开始的“纪元”以来的毫秒数。
 * DateFormat对象上设置时区,以显示相应时区日期和时间
 */
public class FgDateUtils {

    public static final long MILLIS_PER_SECOND = 1000;
    public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND;
    public static final long MILLIS_PER_HOUR = 60 * MILLIS_PER_MINUTE;
    public static final long MILLIS_PER_DAY = 24 * MILLIS_PER_HOUR;


    public static String YYYY = "yyyy";
    public static String YYYY_MM = "yyyy-MM";
    public static String YYYY_MM_DD = "yyyy-MM-dd";
    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static String YYYY_MM_DD_HH_MM_SS_FFF = "yyyy-MM-dd HH:mm:ss.SSS";
    public static String SLASH_YYYY_MM_DD_HH_MM_SS = "yyyy/MM/dd HH:mm:ss";
    public static String SLASH_YYYY_MM_DD_HH_MM_SS_FFF = "yyyy/MM/dd HH:mm:ss.SSS";

    /**
     * 返回当前系统时间(秒)
     */
    public static int getCurSec() {
        return Math.toIntExact(getCurMills());
    }

    /**
     * 返回当前系统时间(毫秒)
     */
    public static long getCurMills() {
        return System.currentTimeMillis();
    }

    /**
     * 毫秒数转字符串,格式:yyyy-MM-dd HH:mm:ss
     */
    public static String millsToDateTime(long mills) {
        return dateTime(new Date(mills));
    }

    /**
     * 秒数转字符串,格式:yyyy-MM-dd HH:mm:ss
     */
    public static String secToDateTime(int sec) {
        return dateTime(new Date(sec * MILLIS_PER_SECOND));
    }

    /**
     * 将日期转yyyy-MM-dd格式
     */
    public static String date(final Date date) {
        return formatDateTime(date, YYYY_MM_DD);
    }

    /**
     * 将日期转yyyy-MM-dd HH:mm:ss格式
     */
    public static String dateTime(final Date date) {
        return formatDateTime(date, YYYY_MM_DD_HH_MM_SS);
    }

    /**
     * 将yyyy-MM-dd HH:mm:ss格式的字符串转日期
     */
    public static Date parseDateTime(final String str) {
        return parseToDate(str, YYYY_MM_DD_HH_MM_SS);
    }

    /**
     * 根据字符串格式格式化日期
     */
    public static String formatDateTime(final Date date, final String format) {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 将字符串按给定格式解析为日期
     */
    public static Date parseToDate(final String str, final String format) {
        if (str == null) {
            return null;
        }
        try {
            return new SimpleDateFormat(format).parse(str);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 返回相对当前月份的偏移月数,所在月份第一天0点整日期,offset表示偏移量,如上个月为-1
     */
    public static Date truncateMonByOffset(int offset) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH,offset);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return truncateDate(calendar);
    }
    /**
     * 指定时间搓(毫秒)当月第一天的0点整
     */
    public static Date truncateMon(long millsTime) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(millsTime);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return truncateDate(calendar);
    }
    /**
     * 指定时间搓(毫秒)当天的0点整
     */
    public static Date truncateDate(long millsTime) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(millsTime);
        return truncateDate(calendar);
    }
    /**
     * 返回相对今天的偏移天数,当天的0点日期
     */
    public static Date truncateDateByOffset(int offset) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.DAY_OF_MONTH, offset);
        return truncateDate(calendar);
    }
    /**
     * 更好的是apache DateUtils 的实现
     */
    public static Date truncateDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return truncateDate(calendar);
    }

    /**
     * 更好的是apache DateUtils 的实现
     */
    public static Date truncateDate(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }
}
posted @ 2021-04-14 11:02  froggengo  阅读(89)  评论(0编辑  收藏  举报