这篇文章主要为大家详细总结了常用的java日期比较和日期计算方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
1.获取两个日期的差值(返回的是时间戳)
/**
* 这个是用来获取两个日期的差值的
*
* @return 差值
*/
public static Long getSubTime(String date3,String date4) {
Date date1 = null, date2 = null, date3 = null;
//使用SimpleDateFormat类格式化日期
SimpleDateFormat rule = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
try {
date1 = rule.parse(date3);
date2 = rule.parse(date4);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Long time1 = date1.getTime();
Long time2 = date2.getTime();
Long time3 = time1 > time2 ? time1 - time2 : time2 - time1;
return time3;
}
2.返回两个日期相差的小时数
public static int daysBetween2(String startTime, String endTime) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH");
Calendar cal = Calendar.getInstance();
long time1 = 0;
long time2 = 0;
try{
cal.setTime(sdf.parse(startTime));
time1 = cal.getTimeInMillis();
cal.setTime(sdf.parse(endTime));
time2 = cal.getTimeInMillis();
}catch(Exception e){
e.printStackTrace();
}
long between_days=(time2-time1)/(1000*3600);
return Integer.parseInt(String.valueOf(between_days));
}
3.判定某日期是否在规定的两个日期之间
/**
* 这个方法是用来判定某日期是否在规定的两个日期之间的。
*/
public static void getINTwoTime(String start,String test,String end) {
Date date1 = null, date2 = null, date3 = null;
SimpleDateFormat rule = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
try {
date1 = rule.parse(start);
date2 = rule.parse(test);
date3 = rule.parse(end);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//第一种:使用Date类的before和after方法;
if((date1.before(date3)&&date2.after(date3))||(date2.before(date3)&&date1.after(date3))) {
System.out.println("在里面");
}else {
System.out.println("不在里面");
}
//第二种:使用时间戳来比较
/*Long time1 = date1.getTime();
Long time2 = date2.getTime();
Long time3 = date3.getTime();
Long time4 = time1 > time2 ? time1 : time2;
if(time4 == time1) {
if(time3<time1&&time3>time2) {
System.out.println("在里面");
}else {
System.out.println("不在里面");
}
}else {
if(time3>time1&&time3<time2) {
System.out.println("在里面");
}else {
System.out.println("不在里面");
}
}*/
}
4.获取指定时间后的日期的;指定天数指定分钟。
/**
* 这个方法是用来获取指定时间后的日期的;指定天数指定分钟。
*/
public static void lastDay(Calendar date3) {
// 获取的东西比较多,例如:年月日时分秒毫秒。默认地方......
//Calendar date3 = Calendar.getInstance();
date3.add(Calendar.DAY_OF_MONTH, 5);//使用日历类的add方法;
Date date = date3.getTime();
System.out.println("时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(date));
date3.add(Calendar.MINUTE,80);
Date date1 = date3.getTime();
System.out.println("时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(date1));
}
5.获取当前月的最后一天或者第一天。
/**
* 这个方法是用来获取当前月的最后一天或者第一天的。
*/
public static void getTime() {
String firstDay;
String lastDay;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 获取前月的第一天
Calendar cal_1 = Calendar.getInstance();// 获取当前日期等
cal_1.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
firstDay = format.format(cal_1.getTime());
System.out.println("firstDay:" + firstDay);
// 获取前月的最后一天
Calendar cale = Calendar.getInstance();
cale.add(Calendar.MONTH, 1);
cale.set(Calendar.DAY_OF_MONTH, 0);// 设置为0号,即为前一个月最后一天
lastDay = format.format(cale.getTime());
System.out.println("lastDay:" + lastDay);
// 获取当前月最后一天
Calendar ca = Calendar.getInstance();
ca.set(Calendar.DAY_OF_MONTH,ca.getActualMaximum(Calendar.DAY_OF_MONTH));
// getActualMaximum获取指定日期当月总天数。
String last = format.format(ca.getTime());
System.out.println("lastDay:" + last);
}
6.获取上周,下周周几的日期。
/**
* 这个类是用来获取上周下周周几的日期的
* SimpleDateFormat 是DateFormat的子类是个具体类。DateFormat是日期/时间格式化子类的抽象类
*/
public static void getWeek() {
Calendar preWeekSundayCal = Calendar.getInstance();
Calendar preWeekMondayCal = Calendar.getInstance();
Calendar lastWeekSundayCal = Calendar.getInstance();
// 设置时间成本周第一天(周日)
preWeekSundayCal.set(Calendar.DAY_OF_WEEK, 1);
preWeekMondayCal.set(Calendar.DAY_OF_WEEK, 1);
lastWeekSundayCal.set(Calendar.DAY_OF_WEEK, 1);
// 上周日时间
preWeekSundayCal.add(Calendar.DATE, -7);
// 上周一时间
preWeekMondayCal.add(Calendar.DATE, -6);
// 下周日时间
lastWeekSundayCal.add(Calendar.DAY_OF_WEEK, 14);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 转化为日期
String times1 = sdf.format(preWeekSundayCal.getTime());
String times2 = sdf.format(preWeekMondayCal.getTime());
String times3 = sdf.format(lastWeekSundayCal.getTime());
System.out.println(times1);
System.out.println(times2);
System.out.println(times3);
}
7.获取当前各个时区的时间。GMT 0 为格林威治时间。 北京为东八区 为GMT+8
/**
* 这个方法是用来获取各个时区的时间的。GMT 0 为格林威治时间。 北京为东八区 为GMT+8
*/
public static void getUSTime() {
SimpleDateFormat time1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
time1.setTimeZone(TimeZone.getTimeZone("GMT-4"));
Calendar c = Calendar.getInstance();
System.out.println(time1.format(c.getTime()));
//这里是对时间进行了格式化。不管用日历类还是Date类
// Date date = new Date();
// System.out.println(time1.format(date));
}
8.当前时区之间时间转换
/**
* 这个方法是用来时区之间转换的
*/
public static void getGMT9Time() {
SimpleDateFormat time1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
time1.setTimeZone(TimeZone.getTimeZone("GMT+9"));
Calendar c = Calendar.getInstance();
System.out.println(time1.format(c.getTime())); //这里是对时间进行了格式化。不管用日历类还是Date类
time1.setTimeZone(TimeZone.getTimeZone("GMT+8"));
Date date = new Date();
System.out.println(time1.format(date));
}
9.计算两段日期的重合日期
/**
* 计算两段日期的重合日期
* @param start1开始日期1
* @param end1 结束日期1
* @param start2开始日期2
* @param end2 结束日期2
* @return map集合
* @throws Exception
*/
public static Map<String,Object> comparisonRQ(String start1, String end1,
String start2,String end2) throws Exception {
String mesg = "";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String startdate = "";
String enddate = "";
try {
Date startDate1 = df.parse(start1);
Date endDate1 = df.parse(end1);
Date startDate2 = df.parse(start2);
Date endDate2 = df.parse(end2);
System.out.println(startDate1.getTime());
System.out.println(endDate1.getTime());
System.out.println(startDate2.getTime());
System.out.println(endDate2.getTime());
//第一段时间开始时间小于第二段时间开始时间,并且第二段开始时间小于第一段结束时间,第二段结束时间大于第一段结束时间
//类似:1-5 和4-8
if (startDate1.getTime()<=startDate2.getTime()&&startDate2.getTime()<=endDate1.getTime()&&endDate1.getTime()<=endDate2.getTime()) {
mesg = "f";//重合
startdate = start2;
enddate = end1;
}
//类似于3-6 和2-8;
else if (startDate1.getTime()>=startDate2.getTime()&&startDate2.getTime()<=endDate1.getTime()&&endDate1.getTime()<=endDate2.getTime()) {
mesg = "f";//重合
startdate = start1;
enddate = end1;
}
//类似于 3-9 和 2-8
else if (startDate2.getTime()<=startDate1.getTime()&&startDate1.getTime()<=endDate2.getTime()&&endDate2.getTime()<=endDate1.getTime()) {
mesg = "f";//重合
startdate = start1;
enddate = end2;
}
//类似于 2-8 和 3-6;
else if (startDate2.getTime()>=startDate1.getTime()&&startDate1.getTime()<=endDate2.getTime()&&endDate2.getTime()<=endDate1.getTime()) {
mesg = "f";//重合
startdate = start2;
enddate = end2;
}else {
System.out.println("两段日期没有重合");
}
System.out.println(startdate+"至"+enddate+"年重合的日期是:");
}catch (ParseException e) {
e.printStackTrace();
throw new ParseException(e.getMessage(), 0);
}catch(Exception e){
e.printStackTrace();
throw new Exception(e);
}
Map<String,Object> map = new HashMap<String,Object>();
map.put("enddate", enddate);
map.put("startdate", startdate);
return map;
}
10.另外附上一个窗口动态显示各个时区时间的参考代码。
//我实现一个时钟窗口程序给你了,好让你更容易理解,希望对你有帮助。
import java.awt.*;
import java.awt.event.*;
import java.util.*;
//世界时钟
public class TimerTest {
public static void main(String[] args) {
new TimerTestFrame("世界时钟");
}
}
class TimerTestFrame extends Frame {
/**
*
*/
private static final long serialVersionUID = 1L;
public TimerTestFrame(String s) {
super(s);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
setLayout(new GridLayout(2, 6));
ClockCanvas clk1 = new ClockCanvas("北京", "GMT+8"); // 创建时钟
ClockCanvas clk2 = new ClockCanvas("巴黎", "GMT+2");
ClockCanvas clk3 = new ClockCanvas("华盛顿", "GMT-4");
ClockCanvas clk4 = new ClockCanvas("洛衫矶", "GMT-7");
ClockCanvas clk5 = new ClockCanvas("伦敦", "GMT+1");
ClockCanvas clk6 = new ClockCanvas("芝加哥", "GMT-5");
add(clk1);
add(clk2);
add(clk3);
add(clk4);
add(clk5);
add(clk6);
setSize(500, 350); // 设置框架宽高
setVisible(true);
}
}
class ClockCanvas extends Canvas implements Runnable {
/**
*
*/
private static final long serialVersionUID = 1L;
private int seconds = 0;
private String city;
private GregorianCalendar calendar;
Thread t;
public ClockCanvas(String c, String tz) {
city = c;
//也可以通过TimeZone.setTimeZone(String n)函数改变时区,n为时区参数名。
calendar = new GregorianCalendar(TimeZone.getTimeZone(tz));
t = new Thread(this);
t.start();
setSize(125, 125); // 设置画布大小
setBackground(Color.black);
}
// 重写父类的方法绘制时钟图形
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
BasicStroke bstroke = new BasicStroke(2.0f);
g2d.setStroke(bstroke);
g2d.setColor(Color.green);
g2d.drawOval(0, 0, 100, 100);
bstroke = new BasicStroke(5.0f);
g2d.setStroke(bstroke);
g2d.drawLine(50, 0, 50, 5);
g2d.drawLine(0, 50, 5, 50);
g2d.drawLine(50, 95, 50, 98);
g2d.drawLine(95, 50, 98, 50);
double hourAngle = 2 * Math.PI * (seconds - 3 * 60 * 60)
/ (12 * 60 * 60);
double minuteAngle = 2 * Math.PI * (seconds - 15 * 60) / (60 * 60);
double secondAngle = 2 * Math.PI * (seconds - 15) / (60);
bstroke = new BasicStroke(5.0f);
g2d.setStroke(bstroke);
g2d.drawLine(50, 50, 50 + (int) (30 * Math.cos(hourAngle)),
50 + (int) (30 * Math.sin(hourAngle)));
bstroke = new BasicStroke(3.0f);
g2d.setStroke(bstroke);
g2d.drawLine(50, 50, 50 + (int) (40 * Math.cos(minuteAngle)),
50 + (int) (40 * Math.sin(minuteAngle)));
bstroke = new BasicStroke(1.0f);
g2d.setStroke(bstroke);
g2d.drawLine(50, 50, 50 + (int) (45 * Math.cos(secondAngle)),
50 + (int) (45 * Math.sin(secondAngle)));
g2d.setColor(Color.red);
g2d.drawString(city, 35, 115);
}
public void timeElapsed() {
//new Date()()获得当前时间
System.out.println(new Date());
calendar.setTime(new Date());
seconds = calendar.get(Calendar.HOUR) * 60 * 60
+ calendar.get(Calendar.MINUTE) * 60
+ calendar.get(Calendar.SECOND);
}
public void run() {
try {
while (true) {
Thread.sleep(300);
timeElapsed();
repaint();
}
} catch (InterruptedException e) {
}
}
}