Java核心類庫 - 時間Date和Calendar

fmms 12年前發布 | 40K 次閱讀 Java Java開發

時間日期
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都在用

例子
 import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;

 public class LongDateDemo {
  public static void main(String[] args) {
   long now = System.currentTimeMillis();
   long year = 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 = new Date();//默認是當前時間(long)
   int y = date.getYear()+1900;
   int month = date.getMonth()+1;
   System.out.println(y+"年"+month+"月");

   //新版本
   //Calendar 歷法
   Calendar cal = new GregorianCalendar();//默認是當前時間(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

例子

import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;

 /**
  * 時間的類型轉換
  */
 public class DateCaseDemo {
  public static void main(String[] args) {
   long gmt = 0;//格林威治時間 1970/01/01

   Date date = new Date();
   date.setTime(gmt);//回到1970 元旦,相當于long -->Date
   System.out.println(date.getYear()+1900);//1970

   Calendar cal = new GregorianCalendar();
   //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
   long l = d.getTime();
   System.out.println(l);//-86400000,因為是在原點以前的時間


  }

 }

三 時間的輸入與輸出
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();

例子

import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;

 public class DateIODemo {
  public static void main(String[] args) throws ParseException {
   Date date = new Date();//當前時間,當前毫秒數
   //輸出yyyy-MM-dd HH:mm:ss
   SimpleDateFormat fmt = 
    new SimpleDateFormat("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 = new SimpleDateFormat("yyyy-MM-dd");
   Date d = f.parse(day);//將日期字符串解析為毫秒數
   long l = d.getTime();
   System.out.println(fmt.format(d));
   String s = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
   System.out.println(s);//2012-04-18
  }

 }

四 時間的計算
 時間計算的問題
 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();
 }

}

轉自:http://www.cnblogs.com/hqr9313/archive/2012/04/19/2458221.html

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!