手稿|手稿 - 帮一同事写的计算时间差(忽略某一天中的某些事件端)工具方法
原需求:计算两个给定的两个时间差,但是要求忽略 21:00~次日09:00。
【手稿|手稿 - 帮一同事写的计算时间差(忽略某一天中的某些事件端)工具方法】思路:
- 一天24小时,切换为一天12个小时。
- 给定的两个时间预处理到,切换到一天中的 09:00 ~ 21:00(有效计算)中
- 然后计算两个时间查:预处理之后的倆时间的差(24h) - 间隔天数*每天有效的时间(12h)
- Test code
package com.test;
import com.sun.tools.javac.util.Assert;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* TestMain
*
* @author: Mr.Rookie
*/
public class TestMain {public static long startIndex = 9 * 60 * 60;
// 9:00 unit: s
public static long during = 12 * 60 * 60;
// start + during = 21:00 unit: spublic final static int DAY_SECOND = 24 * 3600;
public TestMain() {
}public static void main(String args[]) throws Exception {testDuring();
}public static void testDuring() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date start= sdf.parse("2019-01-01 22:00:00");
Date end= sdf.parse("2019-01-01 23:00:00");
System.out.println(formatPrint(during(start, end)));
end= sdf.parse("2019-01-02 12:00:00");
System.out.println(formatPrint(during(start, end)));
end= sdf.parse("2019-01-03 21:00:00");
System.out.println(formatPrint(during(start, end)));
}/**
*
* @param startDate
* @param endDate
* @return
*/
public static long during(Date startDate, Date endDate) {Assert.check(endDate.compareTo(startDate) >= 0, "The endDate must be greater than startDate !!!");
long inputStart = startDate.getTime() / 1000;
long inputEnd= endDate.getTime() / 1000;
if ( inputEnd == inputStart ) {
return 0;
}long startDateTime= getDateOffset(startDate);
long endDateTime= getDateOffset(endDate);
// date during
int dayDuring= (int)(endDateTime -startDateTime) / DAY_SECOND;
// Preprocess parameters of input
long temp = 0;
if ( inputStart < (temp = startDateTime + startIndex) ) {
inputStart = temp;
} else if ( inputStart > (temp += during) ) {
inputStart = temp;
}if ( inputEnd < (temp = endDateTime + startIndex) ) {
inputEnd = temp;
} else if ( inputEnd > (temp += during) ) {
inputEnd = temp;
}// return result
return (inputEnd - inputStart) - dayDuring * (DAY_SECOND - during);
}/**
* 清除指定日期的时间戳信息,并返回当前时间的偏移量,单位秒
* @param date
* @return
*/
private static long getDateOffset(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
// cleartimestamp
instance.set(Calendar.HOUR_OF_DAY, 0);
instance.set(Calendar.MINUTE, 0);
instance.set(Calendar.SECOND, 0);
instance.set(Calendar.MILLISECOND, 0);
return instance.getTime().getTime() / 1000;
}/**
*
* @param second
* @return
*/
private static String formatPrint(long second) {
int day = (int)(second / DAY_SECOND);
// day
int hour = (int)(second %= DAY_SECOND) / 3600;
// h
int min = (int)(second %= 3600) / 60;
return String.format("%02d天%02d小时%02d分%02d秒", day, hour, min, second);
}}
推荐阅读
- 一个人的旅行,三亚
- 一个小故事,我的思考。
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 开学第一天(下)
- 一个人的碎碎念
- 2018年11月19日|2018年11月19日 星期一 亲子日记第144篇
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 第326天
- Y房东的后半生14
- 奔向你的城市