java日期比较和日期计算方法小结

这篇文章主要为大家详细总结了常用的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) {
	}
	}

}

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值