`
还有也许
  • 浏览: 168486 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

日期比较与转换集合

    博客分类:
  • java
 
阅读更多

近段时间关于日期的东西真是太烦人了,又是日期转换又是日期比较的,根据“合格的程序员就是不写重复代码的程序员”的指示精神。总结了一些,写了一个比较全的日期类,可以打成jar包来用。

package com.running.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * <p>Name: 日期工具类(DateUtils)</p>
 * <p>Author:		No24</p>
 * <p>Date:		2006-9-12 12:22:40</p>
 * <p>Modifier:			Fifth</p>
 * <p>DateLastModified:	2008-7-21 17:07</p>
 * <p>Version:		V1.0.1</p>
 * <p>Description:	</p>
 * <p>Remark:		提供一些常用的日期方法
 * 				V1.0.1版本添加了getDate的默认方法
 * </p>
 * <p>Copyright:	Copyright (c) No24 All rights reserved.</p>
 * <p>Company: XCY</p>
 * @author No24
 * @version 1.0
 */

public abstract class DateUtils {
	
    private static final String DEFAULT_DATE_TIME = "yyyy-MM-dd HH:mm:ss";
	
    /**
     * 按指定格式获得当前日期字符串
     * @param format 格式字符串
     * @return 返回指定格式的当前日期字符串
     */
    public static String getDate(String format) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }
    
    /**
     * 按默认的格式获得当前日期字符串
     * @param format 格式字符串
     * @return 返回指定格式的当前日期字符串
     */
    public static String getDate(){
		return new SimpleDateFormat(DEFAULT_DATE_TIME).format(new Date());
	}

    /**
     * 按指定格式获得指定日期字符串
     * @param format 格式字符串
     * @param date 指定日期
     * @return 返回指定格式的指定日期字符串
     */
    public static String getDate(String format, Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }
    
    /**
     * 获得指定日期前面或后面某小时的日期
     * @param date 日期
     * @param i 相差的小时数(负值为前面的日期)
     * @return 返回指定日期前面或后面某小时的日期
     */
    public static Date relationSecond(Date date, int i) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.SECOND, i);
        return cal.getTime();
    }
    
    /**
     * 获得指定日期前面或后面某小时的日期
     * @param date 日期
     * @param i 相差的小时数(负值为前面的日期)
     * @return 返回指定日期前面或后面某小时的日期
     */
    public static Date relationMinute(Date date, int i) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MINUTE, i);
        return cal.getTime();
    }
    
    /**
     * 获得指定日期前面或后面某小时的日期
     * @param date 日期
     * @param i 相差的小时数(负值为前面的日期)
     * @return 返回指定日期前面或后面某小时的日期
     */
    public static Date relationHour(Date date, int i) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR, i);
        return cal.getTime();
    }
    
    /**
     * 获得指定日期前面或后面某天的日期
     * @param date 日期
     * @param i 相差的天数(负值为前面的日期)
     * @return 返回指定日期前面或后面某天的日期
     */
    public static Date relationDate(Date date, int i) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, i);
        return cal.getTime();
    }
    
    
    /**
     * 获得指定日期前面或后面某月的日期
     * @param date 日期
     * @param i 相差的月数(负值为前面的日期)
     * @return 返回指定日期前面或后面某天的日期
     */
    public static Date relationMonth(Date date, int i) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, i);
        return cal.getTime();
    }

    /**
     * 转换日期字符串成日期对象
     * @param s 日期字符串
     * @return 返回日期对象
     * @throws  Exception
     */
    public static Date parseDate(String s) throws Exception {
        DateFormat df = DateFormat.getDateInstance(DateFormat.DEFAULT,new Locale("zh", "CN"));
        return df.parse(s);
    }
    
    public static Date parseDate(String s,String format) throws Exception {
    	SimpleDateFormat sdf = null;
    	if (format == null) {
    		sdf = new SimpleDateFormat(DEFAULT_DATE_TIME);
    	} else {
    		sdf = new SimpleDateFormat(format);
    	}
    	return sdf.parse(s);
    }
    
    public static String getDirDate(){
    	Calendar calendar = Calendar.getInstance();
    	return calendar.get(Calendar.YEAR) + "/"+ (calendar.get(Calendar.MONTH)+1) + "/" + calendar.get(Calendar.DAY_OF_MONTH) + "/";
    }
   // public static 
    //2011-1-14 闫振伟添加
  //获得指定日期的本月最初时间和最后时间
	public static String getDate(int num,Date date){
		String stringDate="";
		SimpleDateFormat sf=null;
		
		if(num==1){
			sf=new SimpleDateFormat("yyyy-MM");
			stringDate=sf.format(date)+"-"+getFirstDayOfMonth(new Date())+" 00:00:00";
		}else if(num==2){
			sf=new SimpleDateFormat("yyyy-MM");
			int lastDay=getLastDayOfMonth(new Date());
			stringDate=sf.format(date)+"-"+lastDay+" 23:59:59";
		}
		return stringDate;
	}
	//获得某个月的第一天
	private static int getFirstDayOfMonth(Date a){
		
	    Calendar   b   =   Calendar.getInstance(); 
	    b.setTime(a); 
	    int   firstDay   =   b.getActualMinimum(Calendar.DAY_OF_MONTH); 
	    return firstDay;
	}
	//获得某个月的最后一天
	private static int getLastDayOfMonth(Date a){
		
	    Calendar   b   =   Calendar.getInstance(); 
	    b.setTime(a); 
	    int   lastDay   =   b.getActualMaximum(Calendar.DAY_OF_MONTH); 
	    return lastDay;
	}
	/**    
     * @param date1 需要比较的时间 不能为空(null),需要正确的日期格式 ,如:2009-09-12   
     * @param date2 被比较的时间  为空(null)则为当前时间    
     * @param stype 返回值类型   0为多少天,1为多少个月,2为多少年    
     * @return    
     * 举例:  
     * compareDate("2009-09-12", null, 0);//比较天  
     * compareDate("2009-09-12", null, 1);//比较月  
     * compareDate("2009-09-12", null, 2);//比较年  
     */
	public static int compareDate(String startDay,String endDay,int stype){     
        int n = 0;     
        String[] u = {"天","月","年"};     
        String formatStyle = stype==1?"yyyy-MM":"yyyy-MM-dd";     
             
        endDay = endDay==null?getCurrentDate("yyyy-MM-dd"):endDay;     
             
        DateFormat df = new SimpleDateFormat(formatStyle);     
        Calendar c1 = Calendar.getInstance();     
        Calendar c2 = Calendar.getInstance();     
        try {     
            c1.setTime(df.parse(startDay));     
            c2.setTime(df.parse(endDay));     
        } catch (Exception e3) {     
            System.out.println("时间在初始化时出错!");     
        }     
        //List list = new ArrayList();     
        while (!c1.after(c2)) {                   // 循环对比,直到相等,n 就是所要的结果     
            //list.add(df.format(c1.getTime()));    // 这里可以把间隔的日期存到数组中 打印出来     
            n++;     
            if(stype==1){     
                c1.add(Calendar.MONTH, 1);          // 比较月份,月份+1     
            }     
            else{     
                c1.add(Calendar.DATE, 1);           // 比较天数,日期+1     
            }     
        }     
        n = n-1;     
        if(stype==2){     
            n = (int)n/365;     
        }        
        //System.out.println(startDay+" -- "+endDay+" 相差多少"+u[stype]+":"+n);           
        return n;     
    }      
	public static String compareTime(String startTime,String endTime,String format){
		Calendar c1 = Calendar.getInstance();     
        Calendar c2 = Calendar.getInstance();     
        DateFormat df = new SimpleDateFormat(format);
        try {     
            c1.setTime(df.parse(startTime));     
            c2.setTime(df.parse(endTime));     
        } catch (Exception e3) {     
            System.out.println("时间在初始化时出错!");     
        }
        if(c1.after(c2)){
        	return "after";
        }else if(c2.after(c1)){
        	return "before";
        }else{
        	return "equals";
        }
	}
	
	public static String getCurrentDate(String format){   
        Calendar day=Calendar.getInstance();    
        day.add(Calendar.DATE,0);    
        SimpleDateFormat sdf=new SimpleDateFormat(format);//"yyyy-MM-dd"   
        String date = sdf.format(day.getTime());   
        return date;   
    } 
    public static void main(String[] args){
    	//按指定类型获得当前时间
    	String date1=DateUtils.getDate("今天是 yyyy-MM-dd");
    	//按默认格式获得当前时间,默认格式是yyyy-MM-dd hh:mm:ss
        String date2=DateUtils.getDate();
        //按指定格式格式化指定日期
        String date3=DateUtils.getDate("yyyy--MM--dd",new Date());
        //获得指定日期前后的天数
        Date date4=DateUtils.relationDate(new Date(), 0);
      //获得指定日期前后的月数
        Date date5=DateUtils.relationMonth(new Date(), 0);
      //获得指定日期前后的小时数
        Date date6=DateUtils.relationHour(new Date(), -1);
      //获得指定日期前后的分钟数
        Date date7=DateUtils.relationMinute(new Date(), -1);
      //获得指定日期前后的秒数
        Date date8=DateUtils.relationSecond(new Date(), -1);
        
        //将日期字符串转换为日期对象
        try {
			Date date9=DateUtils.parseDate("2010-11-11");
			System.out.println(DateUtils.getDate("yyyy-MM-dd", date9));
			Date date10=DateUtils.parseDate("2010-11-11 19:23:59","yyyy-MM-dd hh:mm:ss");
			String date11=DateUtils.getDirDate();
			System.out.println("-------------");
			System.out.println("date9="+date9);
		    System.out.println("date10="+date10);
		    System.out.println(date11);
		    System.out.println("-------------");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    System.out.println(date1);
	    System.out.println(date2);
	    System.out.println(date3);
	    System.out.println(date4);
	    System.out.println(date5);
	    System.out.println(date6);
	    System.out.println(date7);
	    System.out.println(date8);
	    String date12=DateUtils.getDate(1, new Date());
	    System.out.println(date12);
	    String date13=DateUtils.getDate(2, new Date());
	    System.out.println(date13);
	    int date14=DateUtils.getLastDayOfMonth(new Date());
	    System.out.println(date14);
	    int date15=DateUtils.getFirstDayOfMonth(new Date());
	    System.out.println(date15);
    }
}

 

附上我的API,大家看了之后要多提建议呀。

1
0
分享到:
评论
2 楼 还有也许 2011-01-18  
jamesji 写道
It should be a final class instead of abstract class.

Your advice was very much to the point.
1 楼 jamesji 2011-01-14  
It should be a final class instead of abstract class.

相关推荐

    WorkerError(解决方案).md

    项目中常见的问题,记录一下解决方案

    2024-2025第一学期一上U1~3.pdf

    2024-2025第一学期一上U1~3.pdf

    Redis详解与常见问题解决方案中文最新版本

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。感兴趣的朋友可以过来看看

    ASP+ACCESS航班在线定票系统设计(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    全国月尺度平均气温-Tm-1961-2022-025x025

    全国月尺度平均气温数据集(1961-2022, 0.25° × 0.25°)是一个高分辨率的网格化平均气温数据集,覆盖了中国大陆及周边地区。 该数据集通过科学方法整合气象观测和再分析数据,为气候研究、生态模型、农业生产、以及水资源管理等领域提供了重要支持。 数据下载后可显示详细信息。

    yolo算法-筷子数据集-588张图像带标签-.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    shell脚本编程实践,分享给有需要的人,仅供参考

    模拟退火算法shell脚本编程实践,分享给有需要的人,仅供参考。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    基于PCIe接口的高性能视频编辑系统.docx

    基于PCIe接口的高性能视频编辑系统

    python爬虫入门,分享给有需要的人,仅供参考

    python爬虫入门,分享给有需要的人,仅供参考。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    在线音乐网站的设计与实现

    在线音乐网站的设计与实现

    电工与电子技术课程标准.doc

    电工与电子技术课程标准.doc

    1-全国各地级市人口、城镇居民人均可支配收入、进出口总额、社会消费品零售总额2015-2021年-社科数据.zip

    根据搜索结果,以下是一条关于社科数据的内容介绍:本数据集涵盖了2015至2021年间全国各地级市的关键经济指标,包括人口数量、城镇居民人均可支配收入、进出口总额以及社会消费品零售总额。这些数据为研究区域经济发展提供了宝贵的信息资源,来源于各省市统计年鉴及国家统计局的官方数据,确保了数据的权威性和准确性。数据内容全面,缺失值较少,适合用于宏观经济分析、政策评估以及学术研究等多个领域。通过这些数据,研究者可以深入了解中国各地区在不同年份的经济表现和发展趋势。

    SessionStorageError(解决方案).md

    项目中常见的问题,记录一下解决方案

    yolo算法-大卡车数据集-96张图像带标签--卡车.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    6.html

    6

    [net毕业设计]asp.net教师教学评价分析系统(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    IP破解(5):DWC-ddrctl-lpddr54(LPDDR4/4X/5控制器)

    S家LPDDR5/4/4X 控制器,针对功耗、延迟、带宽和面积进行了优化,支持 JEDEC 标准 LPDDR5、LPDDR4 和 LPDDR4X SDRAM。控制器通过 DFI 5.0 接口连接到 S家LPDDR5/4/4X PHY 或其他 LPDDR5/4/4X PHY,以创建一个完整的内存接口解决方案。S LPDDR5/4/4X 控制器包括软件配置寄存器,可通过 AMBA 3.0 APB 接口访问。 // Key Used : DWC-DDRCTL (IP access) // Key Used : DWC-LPDDR54-CONTROLLER (Add-on feature access: DWC LPDDR5/4/4X Controller) 注意:压缩包只有IP使用文档,完整IP及无加密SV代码压缩包有获取方式。

    java桌面小程序,主要为游戏.zip学习资源

    java桌面小程序,主要为游戏.zip学习资源VM

    1-全国各省、市、县农业保险绿色保险收入支出赔付率统计数据2002-2020年-社科数据.zip

    全国各省、市、县农业保险绿色保险收入支出赔付率统计数据集涵盖了2002至2020年间的详细数据。该数据集包含全国31个省、自治区、直辖市的农业保险收入、支出、保险总支出、农业保险规模占比以及农业保险赔付率等关键指标。此外,数据还涉及341个地级市的农业保险收入和支出年度数据,时间跨度从2002年到2020年。特别值得一提的是,数据中还包括了县级政府农业保险补贴数据,覆盖了产粮大县726个和非产粮大县755个,时间范围为2016至2018年。这些数据均来源于历年中国保险年鉴,并经过手工整理,提供了农业保险规模占比与农业保险赔付率等重要指标。此数据集为研究中国农业保险市场的发展、政策效果评估以及风险管理提供了宝贵的实证资料。

    中医诊所系统,WPF.zip

    中医诊所系统,WPF.zip

Global site tag (gtag.js) - Google Analytics