Java核心类库 - 时间Date和Calendar

来源:互联网 发布:录制慢动作视频软件 编辑:程序博客网 时间:2024/05/21 16:55

时间日期
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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
例子
 importjava.util.Calendar;
 importjava.util.Date;
 importjava.util.GregorianCalendar;
  
 publicclass LongDateDemo {
  publicstatic void main(String[] args) {
   longnow = System.currentTimeMillis();
   longyear = now/1000/60/60/24/365+1970;
   System.out.println(year);
   //一年 地球绕太阳一圈(365天+1/4天)
   //原点(公元元年)
    
   /* date.getYear()是将date内部的long时间,根据历法计算
    * 为年份,返回值是2位数年份,如:1997年返回97,但是过了
    * 2K年,返回3位数年份,如2012返回112
    */
    
   //老板本
   Date date = newDate();//默认是当前时间(long)
   inty = date.getYear()+1900;
   intmonth = date.getMonth()+1;
   System.out.println(y+"年"+month+"月");
    
   //新版本
   //Calendar 历法
   Calendar cal = newGregorianCalendar();//默认是当前时间(long)
   y = cal.get(Calendar.YEAR);//2012
   month = cal.get(Calendar.MONTH)+1;//4
   System.out.println(y+"年"+month+"月");
    
    
  }
  
 }
二 时间类型转换  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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<strong>importjava.util.Calendar;
 importjava.util.Date;
 importjava.util.GregorianCalendar;
  
 /**
  * 时间的类型转换
  */
 publicclass DateCaseDemo {
  publicstatic void main(String[] args) {
   longgmt = 0;//格林威治时间 1970/01/01
    
   Date date = newDate();
   date.setTime(gmt);//回到1970 元旦,相当于long -->Date
   System.out.println(date.getYear()+1900);//1970
    
   Calendar cal = newGregorianCalendar();
   //date --> cal
   cal.setTime(date);//将cal设置为date的时间,也是1970
   System.out.println(cal.get(Calendar.YEAR));//1970
   //date 和 cal ,gmt 代表同一时刻
   //加-1天,是在当前时间上加-1天,就是减少1天,就是减少1天的毫秒数(1000*60*60*24)
   cal.add(Calendar.DAY_OF_YEAR,-1);
   Date d = cal.getTime();
   System.out.println(d);//1969
   longl = d.getTime();
   System.out.println(l);//-86400000,因为是在原点以前的时间
  
    
  }
  
 }</strong>

三 时间的输入与输出
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<strong>importjava.text.ParseException;
 importjava.text.SimpleDateFormat;
 importjava.util.Date;
  
 publicclass DateIODemo {
  publicstatic void main(String[] args) throwsParseException {
   Date date = newDate();//当前时间,当前毫秒数
   //输出yyyy-MM-dd HH:mm:ss
   SimpleDateFormat fmt =
    newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   //将日期类型格式化为时间字符串
   String str = fmt.format(date);//日期格式化
   System.out.println(str);//2012-12-21 00:00:00
   //解析日期字符串为日期类型对象
   String day = "2012-12-21";
   SimpleDateFormat f = newSimpleDateFormat("yyyy-MM-dd");
   Date d = f.parse(day);//将日期字符串解析为毫秒数
   longl = d.getTime();
   System.out.println(fmt.format(d));
   String s = newSimpleDateFormat("yyyy-MM-dd").format(newDate());
   System.out.println(s);//2012-04-18
  }
  
 }</strong>

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
例子
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
importjava.util.GregorianCalendar;
 
publicclass DateCalDemo {
 publicstatic void main(String[] args) {
  //简单时间计算
  longl = System.currentTimeMillis();//当前时间
  l += 1000L*60*60*24*3;//3天以后
  SimpleDateFormat sdm = newSimpleDateFormat("yyyy-MM-dd"); 
  String s = sdm.format(newDate(l));
  System.out.println(s);
  //复杂时间计算
  Calendar cal = newGregorianCalendar();
  cal.add(Calendar.YEAR, 2);//2年以后
  cal.set(Calendar.MONTH,Calendar.JANUARY);//设置月份为1月
  System.out.println(sdm.format(cal.getTime()));//2年以后的1月
   
 }
}
 
例子2
packagecom.tarena.day16;
 
importjava.util.Calendar;
importjava.util.Date;
 
publicclass SpecialDateDemo {
 publicstatic void main(String[] args) {
   
 }
 /**
  * 计算商品的促销日期special Date,规则:商品过期前两周五促销 
  * @param creat
  * @param months
  * @return
  */
 publicstatic Date special(Date creat,intmonths){
  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);//调到本周的周五
  }
  returncal.getTime();
 }
 
}
0 0
原创粉丝点击