zoukankan      html  css  js  c++  java
  • Calendar类

    Calendar是日历类

    一、创建对象

    他是一个抽象类,不能直接实例化

    例如

    Calendar calendar = new Calendar();

    是错误的。

    可以试用以下方法实例化:

    1.使用Calendar的getInstance()方法:

    getInstance

    public static Calendar getInstance(TimeZone zone)
    使用指定时区和默认语言环境获得一个日历。返回的 Calendar 基于当前时间,使用了给定时区和默认语言环境。
    参数:
    zone - 要使用的时区
    返回:
    一个 Calendar。
    Calendar calendar = Calendar.getInstance();

    2.使用GregorianCalendar类,该类继承自Calendar类,可以实例化

    GregorianCalendar GC = new GregorianCalendar();

    二、常用方法

    JAVA的Date类与Calendar类(常用方法)(转载)

    1.用Java.util.Calender来实现
          Calendar calendar=Calendar.getInstance();   
           calendar.setTime(new Date());
            System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//今天的日期 
          calendar.set(Calendar.DAY_OF_MONTH,calendar.get(Calendar.DAY_OF_MONTH)+1);//让日期加1   
          System.out.println(calendar.get(Calendar.DATE));//加1之后的日期Top

    (1)用java.text.SimpleDateFormat和java.util.Date来实现
             Date d=new Date();   
              SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");   
              System.out.println("今天的日期:"+df.format(d));   
              System.out.println("两天前的日期:" + df.format(new Date(d.getTime() - 2 * 24 * 60 * 60 * 1000)));   
              System.out.println("三天后的日期:" + df.format(new Date(d.getTime() + 3 * 24 * 60 * 60 * 1000))); 

    (2)计算某一月份的最大天数
    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.格式化输出日期时间 (这个用的比较多)

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

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

    (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

    5.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()方法;

    6.计算两个任意时间中间的间隔天数(这个比较常用)
    (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);

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

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

    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("M/dd/yyyy hh:mm:ss a",java.util.Locale.US);
    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);

    8. 通过时间求时间

    年月周求日期
    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);

    9. 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();
    }
    }

    三、案例

    使用Calendar类和Date类制作一个小日历:

     1 package Calendar;
     2 
     3 import java.text.ParseException;
     4 import java.text.SimpleDateFormat;
     5 import java.util.Calendar;
     6 import java.util.Date;
     7 import java.util.Scanner;
     8 
     9 public class Demo2 {
    10     public static void main(String args[]) throws ParseException{
    11         Scanner sc = new Scanner(System.in);
    12         System.out.println("请输入年月
     示例:yyyy-mm-dd
    ");
    13         String timeOfString = sc.nextLine();
    14         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    15         Date date = sdf.parse(timeOfString);
    16         System.out.println("日	一	二	三	四	五	六");
    17         Calendar calendar = Calendar.getInstance();
    18         calendar.setTime(date);
    19         int day = calendar.get(Calendar.DAY_OF_MONTH);
    20         calendar.set(Calendar.DATE, 1);
    21         for (int i = 1;i < calendar.get(Calendar.DAY_OF_WEEK);i++){
    22             System.out.print("	");
    23         }
    24         for(int j = 1;j <= calendar.getActualMaximum(Calendar.DATE);j++){
    25             calendar.set(Calendar.DATE, j);
    26             if(j == day){
    27                 System.out.print("*");
    28             }
    29             if(calendar.get(Calendar.DAY_OF_WEEK) != 7){
    30                 System.out.print(j + "	");
    31             }else{
    32                 System.out.print(j + "
    ");
    33             }
    34         }
    35         sc.close();
    36     }
    37 }

    结果

     

  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/cxy2016/p/7119533.html
Copyright © 2011-2022 走看看