获取某一天的开始时间

以下是获取某一天开始时间的三种实现方式

第一种方式

这种方式直接通过使用Calendar类提供的接口来实现。

/**
 * 获取一天的开始时间
 * @param date 某一天时间
 * @return 某一天的开始时间,比如2005-01-01 00:00:00.000
 */
public Date getFirstTimeOfDay_1(Date date){
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    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();
}

第二种方式

这种方式通过以当前时间到1970年1月1号0点0分0秒作为基准时间的差值(间隔毫秒数)实现。

/**
 * 获取一天的开始时间,
 * @param date 某一天时间
 * @return 某一天的开始时间,比如2005-01-01 00:00:00.000
 */
public Date getFirstTimeOfDay_2(Date date){
	//为什么要做这个lessTimeZone计算,主要是时区的问题,造成少一天的情况,
	//比如date='2019-01-02 06:00:00',如果不计算lessTimeZone,这时计算结果就是'2019-01-01 00:00:00',本来想获取的期望结果'2019-01-02 00:00:00',
	//如果date='2019-01-02 09:00:00',这时计算结果就是'2019-01-02 00:00:00',这个结果是符合逾期的。
	//为什么会这样,就是因为存在时区的问题,我们是东八区,date.getTime()的结果并不是到1970年1月1号0点0分0秒(GMT)的毫秒数,而是到1970年1月1号8点0分0秒的毫秒数,
	//你品,你细品
    int lessTimeZone = date.getHours()*60*60*1000/TimeZone.getDefault().getRawOffset() == 0?1:0;
    //date是东八区时间,date.getTime()是到东八区时间之间的毫秒间隔
    long time = date.getTime();
    long zeroT=time/(86400000)*(86400000) - TimeZone.getDefault().getRawOffset();
    //new Date(zeroT)创建一个东八区的时间,会多出来8个小时
    return (new DateTime(zeroT)).plusDays(lessTimeZone).toDate();
}

第三种方式

这种方式通过以当前时间到一个指定的时间作为基准时间的差值(间隔毫秒数)实现。

/**
 * 获取一天的开始时间,
 * @param date 某一天时间
 * @return 某一天的开始时间,比如2005-01-01 00:00:00.000
 */
public Date getFirstTimeOfDay_3(Date date){
    //946656000000L是基准时间2000-01-01 00:00:00:000的毫秒数
    long baseStartDay = 946656000000L;
    long interval = date.getTime()-baseStartDay;
    long dayFirstTime=interval/(86400000)*(86400000)+baseStartDay;
    return new Date(dayFirstTime);
}

单元测试

测试以上3种方式的性能如何

import org.joda.time.DateTime;

import java.io.*;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            test.getFirstTimeOfDay_1(new Date());
        }
        System.out.println("耗时:"+(System.currentTimeMillis()-start));
    }
    //省略代码
}

对以上每一种方法,循环10万次调用。
第一种方式大约耗时:170毫秒
第二种方式大约耗时:200毫秒
第三种方式大约耗时:16毫秒
前两种方式明显耗时比第三种方式要搞很多,但是第三种方式,必须取之前的某一个具体的时间点作为基准,不过也不碍事,一般我们都是获取近期的某天的开始时间,太久远的数据,也不再关心了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值