java关于日期的计算
我们在设计程序时难免会遇到一些关于时间的计算,但是要是自己写程序运算的话会很麻烦,因为我们需要考虑年份是否是闰年,每个月是大月还是小月,如此才能得到准确的答案,但是java中由一些现成的方法,可以帮助我们简化运算。
我们要实现的功能是:
日期 - 日期 = 整型
日期 + 整型 = 日期
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class myTools {
/**
* 根据起始日期和间隔时间计算结束日期
*
* @param sDate 开始时间
*
* @param days 间隔时间
*
* @return 结束时间
* */
public static Date calculateEndDate(Date sDate, int days)
{
//将开始时间赋给日历实例
Calendar sCalendar = Calendar.getInstance();
sCalendar.setTime(sDate);
//计算结束时间
sCalendar.add(Calendar.DATE, days);
//返回Date类型结束时间
return sCalendar.getTime();
}
/**
* 计算两个日期的时间间隔
*
* @param sDate 开始时间
*
* @param eDate 结束时间
*
* @param type 间隔类型("Y/y"--年 "M/m"--月 "D/d"--日)
*
* @return interval时间间隔
* */
public static int calInterval(Date sDate, Date eDate, String type)
{
//时间间隔,初始为0
int interval = 0;
/*比较两个日期的大小,如果开始日期更大,则交换两个日期*/
//标志两个日期是否交换过
boolean reversed = false;
if(compareDate(sDate, eDate) > 0)
{
Date dTest = sDate;
sDate = eDate;
eDate = dTest;
//修改交换标志
reversed = true;
}
/*将两个日期赋给日历实例,并获取年、月、日相关字段值*/
Calendar sCalendar = Calendar.getInstance();
sCalendar.setTime(sDate);
int sYears = sCalendar.get(Calendar.YEAR);
int sMonths = sCalendar.get(Calendar.MONTH);
int sDays = sCalendar.get(Calendar.DAY_OF_YEAR);
Calendar eCalendar = Calendar.getInstance();
eCalendar.setTime(eDate);
int eYears = eCalendar.get(Calendar.YEAR);
int eMonths = eCalendar.get(Calendar.MONTH);
int eDays = eCalendar.get(Calendar.DAY_OF_YEAR);
//年
if(cTrim(type).equals("Y") || cTrim(type).equals("y"))
{
interval = eYears - sYears;
if(eMonths < sMonths)
{
--interval;
}
}
//月
else if(cTrim(type).equals("M") || cTrim(type).equals("m"))
{
interval = 12 * (eYears - sYears);
interval += (eMonths - sMonths);
}
//日
else if(cTrim(type).equals("D") || cTrim(type).equals("d"))
{
interval = 365 * (eYears - sYears);
interval += (eDays - sDays);
//除去闰年天数
while(sYears < eYears)
{
if(isLeapYear(sYears))
{
--interval;
}
++sYears;
}
}
//如果开始日期更大,则返回负值
if(reversed)
{
interval = -interval;
}
//返回计算结果
return interval;
}
/**
*
* 字符串去除两头空格,如果为空,则返回"",如果不空,则返回该字符串去掉前后空格
*
* @param tStr 输入字符串
*
* @return 如果为空,则返回"",如果不空,则返回该字符串去掉前后空格
*
*/
public static String cTrim(String tStr)
{
String ttStr = "";
if (tStr == null)
{}
else
{
ttStr = tStr.trim();
}
return ttStr;
}
/**
* 比较两个Date类型的日期大小
*
* @param sDate 开始时间
*
* @param eDate 结束时间
*
* @return result返回结果(0--相同 1--前者大 2--后者大)
* */
private static int compareDate(Date sDate, Date eDate)
{
int result = 0;
//将开始时间赋给日历实例
Calendar sC = Calendar.getInstance();
sC.setTime(sDate);
//将结束时间赋给日历实例
Calendar eC = Calendar.getInstance();
eC.setTime(eDate);
//比较
result = sC.compareTo(eC);
//返回结果
return result;
}
/**
* 判定某个年份是否是闰年
*
* @param year 待判定的年份
*
* @return 判定结果
* */
private static boolean isLeapYear(int year)
{
return (year%400 == 0 || (year%4 == 0 && year%100 != 0));
}
public static int[] splitInteger(int n, int sum,boolean flag) {
//随机抽取n-1个小于sum的数
List<Integer> list = new ArrayList();
//将0和sum加入到里list中
list.add(0);
//判断生成的正整数集合中是否允许为0,true元素可以为0 false元素不可以为0
if (!flag) {
sum = sum - n;
}
list.add(sum);
int temp = 0;
for (int i = 0; i < n - 1 ; i++) {
temp = (int) (Math.random() * sum);
list.add(temp);
}
Collections.sort(list);
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = list.get(i + 1) - list.get(i);
if (!flag) {
nums[i] += 1;
}
}
return nums;
}
}