zoukankan      html  css  js  c++  java
  • Java核心类库——时间Date和Calendar

    时间日期
    1)java中的时间类有:DateCalendar

    2)java中时间类的本质 long(毫秒数)
      Date = long +历法算法(方法gerYear())
      Calendar = long +历法算法(方法ger())

    3) 时间的标准有两种
     (1970)GMT long
     (0)UTC long
    4) java中基本的时间表示GMT long
    5) java提供了Date类型表示时间和日期
     Date 是long 类型的包装
    6) Calendar 是历法的抽象
     历法:公历,农历,太阳历
    7) GregorianCalendar是历法的实现,采用公历的算法实现的
     Calendar cal = Calendar.getInstance();
     Calendar cal = new GregorianCalendar();//除了日本和泰国,效果等同于上一句
    8) Date和 Calendar的默认值就是系统当前时间

    一 java中表示时间的方式:
    1) 格林威治时间(GMT):1970年1月1日 00:00:00(注:中国是东八区,所以要+8个小时)
      也就是1970年1月1日 08:00:00
    2 )公元元年(UTC): 0年
    3 )目前java中3种日期表达方式long, Date , Calendar都在用

     1 例子
     2 import java.util.Calendar;
     3 import java.util.Date;
     4 import java.util.GregorianCalendar;
     5 
     6 public class LongDateDemo {
     7  public static void main(String[] args) {
     8   long now = System.currentTimeMillis();
     9   long year = now/1000/60/60/24/365 +1970;
    10   System.out.println(year);
    11   //一年 地球绕太阳一圈(365天+1/4天)
    12   //原点(公元元年)
    13   
    14   /* date.getYear()是将date内部的long时间,根据历法计算
    15    * 为年份,返回值是2位数年份,如:1997年返回97,但是过了
    16    * 2K年,返回3位数年份,如2012返回112
    17    */
    18   
    19   //老板本
    20   Date date = new Date();//默认是当前时间(long)
    21   int y = date.getYear()+1900;
    22   int month = date.getMonth()+1;
    23   System.out.println(y+"年"+month+"月");
    24   
    25   //新版本
    26   //Calendar 历法
    27   Calendar cal = new GregorianCalendar();//默认是当前时间(long)
    28   y = cal.get(Calendar.YEAR);//2012
    29   month = cal.get(Calendar.MONTH)+1;//4
    30   System.out.println(y+"年"+month+"月");
    31   
    32   
    33  }
    34 
    35 }


    二 时间类型转换  long <-> Date <-> Calendar
     long --->Date :  dat = new Date(l)
           dat.setTime(l)

     Date --->Calendar : cal.setTime(dat)

     Calendar ---> Date: cal.getTime()


     Date ---> long :dat.getTime()
     注:Date dat  ,  long l  ,Calendar cal

    例子

     1 import java.util.Calendar;
     2 import java.util.Date;
     3 import java.util.GregorianCalendar;
     4 
     5 /**
     6  * 时间的类型转换
     7  */
     8 public class DateCaseDemo {
     9  public static void main(String[] args) {
    10   long gmt = 0;//格林威治时间 1970/01/01
    11   
    12   Date date = new Date();
    13   date.setTime(gmt);//回到1970 元旦,相当于long -->Date
    14   System.out.println(date.getYear()+1900);//1970
    15   
    16   Calendar cal = new GregorianCalendar();
    17   //date --> cal
    18   cal.setTime(date);//将cal设置为date的时间,也是1970
    19   System.out.println(cal.get(Calendar.YEAR));//1970
    20   //date 和 cal ,gmt 代表同一时刻
    21   //加-1天,是在当前时间上加-1天,就是减少1天,就是减少1天的毫秒数(1000*60*60*24)
    22   cal.add(Calendar.DAY_OF_YEAR,-1);
    23   Date d = cal.getTime();
    24   System.out.println(d);//1969
    25   long l = d.getTime();
    26   System.out.println(l);//-86400000,因为是在原点以前的时间
    27 
    28   
    29  }
    30 
    31 }

    三 时间的输入与输出
    1)  日期输出的本质是将Date转换为格式化的String
    2)  日期输入的本质是将格式化的 String转换为 Date
    3)  SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       构建SimpleDateFormat 一般提供日期的格式"yyyy-MM-dd"具体参看javadoc
        如:"yyyy-MM-dd HH:mm:ss"
         "yyyyMMdd"
         "dd/MM/yy"
         "MM/dd/yyyy"

    常用方法

     fmt.parse(String)    可以实现将(合法)字符串解析为日期类型,经常用于处理日期输入
     fmt.format(Date)     可以把日期格式化为字符串用于输出处理

    使用字符串String输出时间

     Date ---> String:
      DateFormat fmt = new SimpleDateFormat("HH:mm:ss");
      fmt.format(date)

    把字符串String时间转为Date时间(个是必须相同)

     String --> Date :
      DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
      fmt.parse("1999-2-2")
    注:java没有提供String直接转换为Calendar的API方法,但第三方提供的API有这种方法
     如果Calendar需要转为String,必须先转换为Date
     Calendar ----> Date :
      Date dat = cal.getTime();

    例子

     1 import java.text.ParseException;
     2 import java.text.SimpleDateFormat;
     3 import java.util.Date;
     4 
     5 public class DateIODemo {
     6  public static void main(String[] args) throws ParseException {
     7   Date date = new Date();//当前时间,当前毫秒数
     8   //输出yyyy-MM-dd HH:mm:ss
     9   SimpleDateFormat fmt = 
    10    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    11   //将日期类型格式化为时间字符串
    12   String str = fmt.format(date);//日期格式化
    13   System.out.println(str);//2012-12-21 00:00:00
    14   //解析日期字符串为日期类型对象
    15   String day = "2012-12-21";
    16   SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
    17   Date d = f.parse(day);//将日期字符串解析为毫秒数
    18   long l = d.getTime();
    19   System.out.println(fmt.format(d));
    20   String s = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
    21   System.out.println(s);//2012-04-18
    22  }
    23 
    24 }

    四 时间的计算
     时间计算的问题
     1) 本质是时间毫秒数的计算

     2) 简单时间计算,直接计算毫秒数,如:3天以后,2小时等
     3) 复杂时间计算,利用Calender类提供的历法算法实现
    常用方法:
         add() set()
         Calendar 提供的方法本是上也是计算毫秒数, 

    例子
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    
    public class DateCalDemo {
     public static void main(String[] args) {
      //简单时间计算
      long l = System.currentTimeMillis();//当前时间
      l += 1000L*60*60*24*3;//3天以后
      SimpleDateFormat sdm = new SimpleDateFormat("yyyy-MM-dd");  
      String s = sdm.format(new Date(l));
      System.out.println(s);
      //复杂时间计算
      Calendar cal = new GregorianCalendar();
      cal.add(Calendar.YEAR, 2);//2年以后
      cal.set(Calendar.MONTH,Calendar.JANUARY);//设置月份为1月
      System.out.println(sdm.format(cal.getTime()));//2年以后的1月
      
     }
    }
    
    例子2
    package com.tarena.day16;
    
    import java.util.Calendar;
    import java.util.Date;
    
    public class SpecialDateDemo {
     public static void main(String[] args) {
      
     }
     /**
      * 计算商品的促销日期special Date,规则:商品过期前两周五促销 
      * @param creat
      * @param months
      * @return
      */
     public static Date special(Date creat,int months){
      Calendar cal = Calendar.getInstance();
      cal.setTime(creat); //生产日期
      cal.add(Calendar.MONTH, months);  //过期日
      cal.add(Calendar.WEEK_OF_YEAR, -2);  //回调2周
      if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){//如果是星期天
       cal.add(Calendar.WEEK_OF_YEAR, -1);//回调一周
       cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);//调到本周的周五
      }
      return cal.getTime();
     }
    
    }
    
     
  • 相关阅读:
    单例模式创建
    盛最多水的容器
    魔术索引
    钢条切割
    比较版本号
    矩阵中的路径
    机器人的运动范围
    计网基础问题
    Linux 下android环境的配置
    Fedora15下安装Android开发环境
  • 原文地址:https://www.cnblogs.com/hqr9313/p/2458221.html
Copyright © 2011-2022 走看看