zoukankan      html  css  js  c++  java
  • Calendar Date 字符串 相互转换 格式化等

    1.计算某一月份的最大天数 

    Calendar time = Calendar.getInstance();
    time.clear();
    time.set(Calendar.YEAR, year); // year 为 int
    time.set(Calendar.MONTH, i - 1); // 注意,Calendar 对象默认一月为0
    int day = time.getActualMaximum(Calendar.DAY_OF_MONTH); // 本月份的天数

     注:在使用set方法之前,必须先clear一下,否则很多信息会继承自系统当前时间。

     

    2.Calendar和Date的转化 

    (1) Calendar转化为Date 

    Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();

    (2) Date转化为Calendar

    Date date = new Date();
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);

     

    3.把字符串转化为java.util.Date

    方法一:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    java.util.Date dt = sdf.parse("2005-2-19");
    System.out.print(sdf.format(dt)); // 输出结果是:2005-2-19

    方法二:

    java.util.Date dt = null;
    DateFormat df = DateFormat.getDateInstance();
    dt = df.parse("2005-12-19");
    System.out.println(dt); // 输出结果为:Mon Dec 19 00:00:00 CST 2005
    System.out.println(df.format(dt)); // 输出结果为:2005-2-19

      

    4.把字符串转化为java.sql.Date

    字符串必须是"yyyy-mm-dd"格式,否则会抛出IllegalArgumentException异常

    java.sql.Date sdt = java.sql.Date.valueOf("2005-9-6");
    System.out.println(sdt); // 输出结果为:2005-9-6

     

    5.格式化输出日期时间 (这个用的比较多) 

    Date date = new Date();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    String time = df.format(date);
    System.out.println(time);

    需要注意的一点:SimpleDateFormat类格式化一个字符串时,可根据需要调用 format() 或 parse() 函数;只不过format()返回String类型,parse()返回java.util.Date类型

     

    6.计算一年中的第几星期 

    (1) 计算某一天是一年中的第几星期

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2006);
    cal.set(Calendar.MONTH, 8);
    cal.set(Calendar.DAY_OF_MONTH, 3);
    int weekno = cal.get(Calendar.WEEK_OF_YEAR);

     (2) 计算一年中的第几星期是几号

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2006);
    cal.set(Calendar.WEEK_OF_YEAR, 1);
    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    System.out.println(df.format(cal.getTime()));
    // 输出:2006-01-02

    7.add()和roll()的用法(不太常用) 

    (1) add()方法 

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2006);
    cal.set(Calendar.MONTH, 8);
    cal.set(Calendar.DAY_OF_MONTH, 3);
    cal.add(Calendar.DATE, -4);
    Date date = cal.getTime();
    System.out.println(df.format(date));
    cal.add(Calendar.DATE, 4);
    date = cal.getTime();
    System.out.println(df.format(date));
    // 输出:
    //    2006-08-30
    //    2006-09-03

    (2) roll方法

    cal.set(Calendar.YEAR, 2006);
    cal.set(Calendar.MONTH, 8);
    cal.set(Calendar.DAY_OF_MONTH, 3);
    cal.roll(Calendar.DATE, -4);
    date = cal.getTime();
    System.out.println(df.format(date));
    cal.roll(Calendar.DATE, 4);
    date = cal.getTime();
    System.out.println(df.format(date));
    // 输出:
    //    2006-09-29
    //    2006-09-03

    可见,roll()方法在本月内循环,一般使用add()方法;

     

    8.计算两个任意时间中间的间隔天数(这个比较常用)

    (1) 传进Calendar对象

    public int getIntervalDays(Calendar startday, Calendar endday) {
        if (startday.after(endday)) {
            Calendar cal = startday;
            startday = endday;
            endday = cal;
        }
        long sl = startday.getTimeInMillis();
        long el = endday.getTimeInMillis();
        long ei = el - sl;
        return (int) (ei / (1000 * 60 * 60 * 24));
    }

    (2) 传进Date对象 

    public int getIntervalDays(Date startday, Date endday) {
        if (startday.after(endday)) {
            Date cal = startday;
            startday = endday;
            endday = cal;
        }
        long sl = startday.getTime();
        long el = endday.getTime();
        long ei = el - sl;
        return (int) (ei / (1000 * 60 * 60 * 24));
    }

    (3)改进精确计算相隔天数的方法   

    public int getDaysBetween(Calendar d1, Calendar d2) {
        if (d1.after(d2)) {
            java.util.Calendar swap = d1;
            d1 = d2;
            d2 = swap;
        }
        int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
        int y2 = d2.get(Calendar.YEAR);
        if (d1.get(Calendar.YEAR) != y2) {
            d1 = (Calendar) d1.clone();
            do {
                days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);// 得到当年的实际天数
                d1.add(Calendar.YEAR, 1);
            } while (d1.get(Calendar.YEAR) != y2);
        }
        return days;
    }

    注意:通过上面的方法可以衍生出求任何时间,如要查出邮箱三周之内收到的邮件(得到当前系统时间-再得到三周前时间)用收件的时间去匹配 最好装化成 long 去比较

    如:1年前日期(注意毫秒的转换)

    java.util.Date myDate = new java.util.Date();
    long myTime = (myDate.getTime() / 1000) - 60 * 60 * 24 * 365;
    myDate.setTime(myTime * 1000);
    String mDate = formatter.format(myDate);

    3周前的日期

    Calendar cal3 = Calendar.getInstance();
    cal3.add(cal3.DATE, -21); // 取3周前的日期
    String date = formatter.format(cal3.getTime());

     

    9. String 和 Date ,Long 之间相互转换 (最常用) 

    字符串转化成时间类型(字符串可以是任意类型,只要和 SimpleDateFormat 中的格式一致即可)
    通常我们取时间跨度的时候,会 substring 出具体时间和 long 比较 

    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("M/dd/yyyy hh:mm:ss a", java.util.Locale.CHINA);
    java.util.Date d = sdf.parse("5/13/2003 10:31:37 AM");
    long dvalue = d.getTime();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String mDateTime1 = formatter.format(d);

     

    10. 通过时间求时间 

    // 年月周求日期
    SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E");
    java.util.Date date2 = formatter2.parse("2003-05 5 星期五");
    SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd");
    String mydate2 = formatter3.format(date2);
    
    // 求星期
    mydate = myFormatter.parse("2001-1-1");
    SimpleDateFormat formatter4 = new SimpleDateFormat("E");
    String mydate3 = formatter4.format(mydate);

     

    11. java 和 具体的数据库结合 

    在开发web应用中,针对不同的数据库日期类型,我们需要在我们的程序中对日期类型做各种不同的转换。若对应数据库数据是oracle的Date类型,即只需要年月日的,可以选择使用java.sql.Date类型,若对应的是MSsqlserver 数据库的DateTime类型,即需要年月日时分秒的,选择java.sql.Timestamp类型。
    你可以使用dateFormat定义时间日期的格式,转一个字符串即可
     

    class Datetest {
        /**
         * method 将字符串类型的日期转换为一个timestamp(时间戳记java.sql.Timestamp)
         * 
         * @param dateString 需要转换为timestamp的字符串
         * 
         * @return dataTime timestamp
         */    
        public final static java.sql.Timestamp string2Time(String dateString) throws java.text.ParseException {
            DateFormat dateFormat;
            dateFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss.SSS",
                    Locale.ENGLISH);// 设定格式
            // dateFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss",
            // Locale.ENGLISH);
            dateFormat.setLenient(false);
            java.util.Date timeDate = dateFormat.parse(dateString);// util类型
            java.sql.Timestamp dateTime = new java.sql.Timestamp(timeDate.getTime());// Timestamp类型,timeDate.getTime()返回一个long型
            return dateTime;
        }
        
        /**
         * method 将字符串类型的日期转换为一个Date(java.sql.Date)
         * 
         * @param dateString 需要转换为Date的字符串
         * 
         * @return dataTime Date
         */
        public final static java.sql.Date string2Date(String dateString) throws java.lang.Exception {
            DateFormat dateFormat;
            dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
            dateFormat.setLenient(false);
            java.util.Date timeDate = dateFormat.parse(dateString);// util类型
            java.sql.Date dateTime = new java.sql.Date(timeDate.getTime());// sql类型
            return dateTime;
        }
        
        public static void main(String[] args) {
            Date da = new Date();
            // 注意:这个地方da.getTime()得到的是一个long型的值
            System.out.println(da.getTime());
            // 由日期date转换为timestamp
            // 第一种方法:使用new Timestamp(long)
            Timestamp t = new Timestamp(new Date().getTime());
            System.out.println(t);
            // 第二种方法:使用Timestamp(int year,int month,int date,int hour,int minute,int
            // second,int nano)
            Timestamp tt = new Timestamp(Calendar.getInstance().get(
            Calendar.YEAR) - 1900, Calendar.getInstance().get(
            Calendar.MONTH), Calendar.getInstance().get(
            Calendar.DATE), Calendar.getInstance().get(
            Calendar.HOUR), Calendar.getInstance().get(
            Calendar.MINUTE), Calendar.getInstance().get(
            Calendar.SECOND), 0);
            System.out.println(tt);
            try {
                String sToDate = "2005-8-18"; // 用于转换成java.sql.Date的字符串
                String sToTimestamp = "2005-8-18 14:21:12.123"; // 用于转换成java.sql.Timestamp的字符串
                Date date1 = string2Date(sToDate);
                Timestamp date2 = string2Time(sToTimestamp);
                System.out.println("Date:" + date1.toString()); // 结果显示
                System.out.println("Timestamp:" + date2.toString()); // 结果显示
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

      

    12. Date的构造函数 

    (1) 构造一个反映当时时间的Date实例

    public Date() { }

    构造一个Date对象并对其进行初始化以反映当前时间。 

    (2) 从一个长整型数据构造一个Date实例

    public Date(long date) { }

    构造一个Date对象,并根据相对于GMT 1970年1月1日00:00:00的毫秒数对其进行初始化。

    参数: 
    date - 相对于GMT 1970年1月1日00:00:00的毫秒数。 

    (3) 从年月日时分秒构造一个Date实例

    public Date(int year, int month, int date) { }
    public Date(int year, int month, int date, int hrs, int min) { }
    public Date(int year, int month, int date, int hrs, int min, int sec) { }

    这三个构造函数均不推荐使用,在JDK 1.1版中,分别被
    Calendar.set(year + 1900, month, date) 或 GregorianCalendar(year + 1900, month, date),
    Calendar.set(year + 1900, month, date, hrs, min) 或 GregorianCalendar(year + 1900, month, date, hrs, min),
    Calendar.set(year + 1900, month, date, hrs, min, sec) 或 GregorianCalendar(year + 1900, month, date, hrs, min, sec)代替。

  • 相关阅读:
    手动渗透测试漏洞
    博弈论一 [ 巴什游戏 ]
    [Error]EOL while scanning string literal
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
  • 原文地址:https://www.cnblogs.com/i0air/p/2793094.html
Copyright © 2011-2022 走看看