zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/froggengo/p/14656866.html
Copyright © 2011-2022 走看看