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();
        }
    }
    
  • 相关阅读:
    【BZOJ1294】围豆豆(SCOI2009)-状压+BFS
    【BZOJ3244】树的计数(NOI2013)-概率期望+数学证明
    【BZOJ4826】影魔(AHOI&HNOI2017)-线段树+离线
    【BZOJ3832】Rally(POI2014)-拓扑排序+最长路+堆
    【BZOJ4556】字符串(TJOI&HEOI2016)-后缀数组+二分+RMQ+主席树
    【BZOJ1029】建筑抢修(JSOI2007)-贪心+堆
    【BZOJ1057】棋盘制作(ZJOI2007)-DP+悬线法
    【BZOJ1025】游戏(SCOI2009)-数论+背包DP
    java日期操作
    list类型for遍历
  • 原文地址:https://www.cnblogs.com/froggengo/p/14656866.html
Copyright © 2011-2022 走看看