一个简单的取就近的五分钟的整数倍的日期

2020-12-23 00:00:00 日期 五分钟 就近

做项目的时候遇到的一个问题,要去离目前时间最近的五分钟的、三十分钟的、两个小时的、一天的整数倍的这个时间。好像叙述不明白了,那我就举两个栗子吧(栗子好吃~):
现在时间是2016-11-23 14:34,取最近的五分钟的整数倍的时间就是2016-11-23 14:30,三十分钟的…就是2016-11-23 14:30,两个小时的…就是2016-11-23 14:00,一天的…就是2016-11-23 00:00。
如果换成现在的时间是2016-11-23 15:37,取最近的五分钟的…就是2016-11-23 15:35,三十分钟的…就是2016-11-23 15:30,两个小时的…就是2016-11-23 14:00,一天的…就是2016-11-23 00:00。
听着好复杂啊,下面看代码吧。下面的方法是我刚开始写的最近的五分钟的整数倍的时间:

/** * 根据date返回最近5的倍数的dateFormat格式的字符串 * @param date * @param dateFormat * @return */
    public static String getcloseFiveTimes(Date date, String dateFormat){
        DateFormat df = new SimpleDateFormat(dateFormat);
        String time = df.format(date);
        int v =  Integer.parseInt(String.valueOf(time.charAt(11)));
        if(v==1 |v==2 |v==3 | v==4 |v==0  ){
            time = time.substring(0, 11)+"0";
        }else {
            time = time.substring(0, 11)+"5";
        }
        return time;
    }
感觉好low,而且三十分钟的时候遇到了问题逻辑会更加复杂。。。冥想。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。取余?1970年01月01日00时00分00秒?试一试:
    /** * 自己才知道的方法,说了你也不懂 * @param dateFormat * @param date * @param min * @return */
    public static String getCloseDate(String dateFormat, Date date, int min){
        long dateTime = date.getTime();
        long needTime = dateTime-dateTime%(min*60*1000);
        return new SimpleDateFormat(dateFormat).format(new Date(needTime));
    }

测试:

public static void main(String a[]) {
        try {
            System.out.println(getCloseDate("yyyyMMddHHmm", new Date(), 5));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

不多说了,继续码代码了。。

出错了,修改。。。。。。。。

/** * * @param dateFormat 要转换的字符串类型 * @param date 时间 * @param min 多少分钟的整数倍 * @return * @throws Exception */
    public static String getCloseDate(String dateFormat, Date date, long min) throws Exception{
        long dateTime = date.getTime();
        System.out.println(dateTime);
        long needTime =0;
        if(min>=8*60){
            return new SimpleDateFormat(dateFormat).format(getMinDate(date));
        }else{
            needTime = dateTime-dateTime%(min*60L*1000L);
        }
        return new SimpleDateFormat(dateFormat).format(new Date(needTime));
    }
/** * 取当前日期的年月日 * * @param format * 格式(如:yyyy-MM-dd) * @return * @throws ParseException */
    public static Date getMinDate(Date date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date newDate = sdf.parse(sdf.format(date));
        return newDate;
    }

昨天太忙,今天过来补充一下昨天的错误原因:时区的问题,北京时间和零时区差八个小时所以代码中如果大于八个小时取余就会有问题。(时区貌似是jvm设定好的,具体什么机制还有待研究,学习之后会补充上去。最近好忙。。)

    原文作者:土豆TM
    原文地址: https://blog.csdn.net/tudou201601/article/details/53305260
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章