程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 進修Java中的日期和時光處置及Java日歷小法式的編寫

進修Java中的日期和時光處置及Java日歷小法式的編寫

編輯:關於JAVA

進修Java中的日期和時光處置及Java日歷小法式的編寫。本站提示廣大學習愛好者:(進修Java中的日期和時光處置及Java日歷小法式的編寫)文章只能為提供參考,不一定能成為您想要的結果。以下是進修Java中的日期和時光處置及Java日歷小法式的編寫正文


Java 在 java.util 包中供給了 Date 類,這個類封裝了以後的日期和時光。

Date 類支撐兩種結構函數。第一個結構函數初始化對象確當前日期和時光。

Date( )
上面的結構函數吸收一個參數等於自1970年1月1日午夜起曾經過的毫秒數

Date(long millisec)

一旦有一個可用的日期對象,可以挪用以下任何一種支撐的辦法應用時光:
SN 辦法和描寫 1 boolean after(Date date)
假如挪用Date對象包括或晚於指定的日期則前往true,不然,前往false。 2 boolean before(Date date)
假如挪用Date對象包括或早於日期指定的日期前往true,不然,前往false。 3 Object clone( )
反復挪用Date對象。 4 int compareTo(Date date)
挪用對象的值與日期比擬。假如這兩個值相等前往0。假如挪用對象是早於日期前往一個負值。假如挪用對象遲於日期前往正值。 5 int compareTo(Object obj)
以雷同的compareTo(Date)操作 假如obj是一個類日期。不然,它會拋出一個ClassCastException。 6 boolean equals(Object date)
假如挪用Date對象包括雷同的時光及日期指定日期則前往true,不然,前往false。 7 long getTime( )
前往自1970年1月1日起曾經過的毫秒數。 8 int hashCode( )
前往挪用對象的哈希代碼。 9 void setTime(long time)
設置所指定的時光,這表現從1970年1月1日從午夜的時光和日期以毫秒為單元經由的時光。 10 String toString( )
挪用Date對象轉換為字符串,並前往成果。
獲得以後日期和時光
在 Java 中輕易獲得以後的日期和時光。可使用一個簡略的 Date 對象的 toString() 辦法,以下所示打印以後日期和時光:

import java.util.Date;

public class DateDemo {
  public static void main(String args[]) {
    // Instantiate a Date object
    Date date = new Date();

    // display time and date using toString()
    System.out.println(date.toString());
  }
}

這將發生以下成果:

Mon May 04 09:51:52 CDT 2009

日期比擬
有以下三種方法來比擬兩個日期:

  • 可使用 getTime() 來取得自1970年1月1日午夜十二時起曾經過的毫秒數,然後比擬兩個對象的值。
  • 可使用 before( ), after( ), 和 equals( ) 辦法,因為12日在18日前,例如, new Date(99, 2, 12).before(new Date (99, 2, 18)) 前往值為 true。
  • 可使用 compareTo() 辦法,這是由 Comparable 接口界說,由 Date 完成。

應用 SimpleDateFormat 格局化日期

SimpleDateFormat 是一個詳細的類,以當地方法用於格局化和轉換日期。SimpleDateFormat 許可選擇用戶界說的形式為日期時光格局。例如:

import java.util.*;
import java.text.*;

public class DateDemo {
  public static void main(String args[]) {

   Date dNow = new Date( );
   SimpleDateFormat ft = 
   new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

   System.out.println("Current Date: " + ft.format(dNow));
  }
}

這將發生以下成果:

Current Date: Sun 2004.07.18 at 04:14:09 PM PDT

簡略的 DateFormat 格局代碼
要指准時間格局,應用時光形式字符串。在這個形式中,一切的 ASCII 字母被保存為形式字母,其界說以下:
字符 描寫 例子 G 時期指導器 AD y 四位數年份 2001 M 年中的月份 July or 07 d 月份中日期 10 h 時光 A.M./P.M.(1~12) 12 H 天中的小時 (0~23) 22 m 小時中的分鐘 30 s 分鐘中的秒鐘 55 S 毫秒 234 E 禮拜中的天 Tuesday D 年中的天 360 F 月中禮拜中的天 2 (second Wed. in July) w 年中的禮拜 40 W 月中的禮拜 1 a A.M./P.M. 標志 PM k 天中的小時(1~24) 24 K 小時A.M./P.M. (0~11) 10 z 時區 東部尺度時光 ' 離開文本 分隔符 " 單引號 `
用 printf 格局化日期
日期和時光格局用 printf 辦法可以異常輕松地做到。可使用兩個字母的格局,從 t 開端並鄙人面給出的表格中的個中一個字母停止。例如:

import java.util.Date;

public class DateDemo {

 public static void main(String args[]) {
   // Instantiate a Date object
   Date date = new Date();

   // display time and date using toString()
   String str = String.format("Current Date/Time : %tc", date );

   System.out.printf(str);
 }
}

這將發生以下成果:

Current Date/Time : Sat Dec 15 16:37:57 MST 2012

假如供給日期屢次格局化是一種欠好的做法。一個格局字符串可以指導要格局化的參數的索引。
索引必需緊跟在 % 以後,並必需由 $ 終止。例如:

import java.util.Date;

public class DateDemo {

  public static void main(String args[]) {
    // Instantiate a Date object
    Date date = new Date();

    // display time and date using toString()
    System.out.printf("%1$s %2$tB %2$td, %2$tY", 
             "Due date:", date);
  }
}

這將發生以下成果:

Due date: February 09, 2004

或許,也能夠應用 < 標記。則表現雷同的參數,依據前述格局標准,應再次應用。例如:

import java.util.Date;

public class DateDemo {

  public static void main(String args[]) {
    // Instantiate a Date object
    Date date = new Date();

    // display formatted date
    System.out.printf("%s %tB %<te, %<tY", 
             "Due date:", date);
  }
}

這將發生以下成果:

Due date: February 09, 2004

日期和時光轉換字符
字符 描寫 例子 c 完全的日期和時光 Mon May 04 09:51:52 CDT 2009 F ISO 8601 日期 2004-02-09 D U.S. 格局時光 (月/日/年) 02/09/2004 T 24-時制 18:05:19 r 12-時制 06:05:19 pm R 24-時制,無秒 18:05 Y 四位數年份 (用前行零列) 2004 y 年份的後兩位數(用前行零列) 04 C 年份的前兩位(用前行零列) 20 B 完全月份稱號 February b 縮寫月份稱號 Feb m 兩位數月份 (用前行零列) 02 d 兩位很多天期 (用前行零列) 03 e 兩位很多天期(無前行零列) 9 A 完全禮拜稱號 Monday a 縮寫禮拜稱號 Mon j 年中的三位數天數(用前行零列) 069 H 兩位數小時(用前行零列), 00 和 23之間 18 k 兩位數小時(無前行零列), 0 和 23 之間 18 I 兩位數小時 (用前行零列), 01和12之間 06 l 兩位數小時 (無前行零列), 1 和12之間 6 M 兩位數分鐘 (用前行零列) 05 S 兩位數秒鐘(用前行零列) 19 L 三位數毫秒(用前行零列) 047 N 九位數納秒 (用前行零列) 047000000 P 年夜寫高低午標志 PM p 小寫高低午標志 pm z RFC 822 從GMT數字抵消 -0800 Z 時區 PST s 從 1970-01-01 00:00:00 的秒數GMT 1078884319 Q 從 1970-01-01 00:00:00 的毫秒數GMT 1078884319047
有相干的日期和時光等有效的類。欲懂得更多具體信息,可以參考 Java 尺度文檔。

字符串轉換日期
SimpleDateFormat 類有一些額定的辦法,如 parse(),它試圖依據存儲在給定 SimpleDateFormat 的對象的格局來轉換字符串。例如:

import java.util.*;
import java.text.*;

public class DateDemo {

  public static void main(String args[]) {
   SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 

   String input = args.length == 0 ? "1818-11-11" : args[0]; 

   System.out.print(input + " Parses as "); 

   Date t; 

   try { 
     t = ft.parse(input); 
     System.out.println(t); 
   } catch (ParseException e) { 
     System.out.println("Unparseable using " + ft); 
   }
  }
}

上述法式的運轉示例將發生以下成果:

$ java DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007

休眠一段時光
你可以停止任何時代的時光休眠,從一毫秒直到你的電腦的全部性命周期。例如,上面的法式會休眠10秒:

import java.util.*;

public class SleepDemo {
  public static void main(String args[]) {
   try { 
     System.out.println(new Date( ) + "\n"); 
     Thread.sleep(5*60*10); 
     System.out.println(new Date( ) + "\n"); 
   } catch (Exception e) { 
     System.out.println("Got an exception!"); 
   }
  }
}

這將發生以下成果:

Sun May 03 18:04:41 GMT 2009

Sun May 03 18:04:51 GMT 2009

丈量履行時光
有時刻,能夠須要丈量的時光點以毫秒為單元。是以,讓我們再一次從新寫下面的例子:

import java.util.*;

public class DiffDemo {

  public static void main(String args[]) {
   try {
     long start = System.currentTimeMillis( );
     System.out.println(new Date( ) + "\n");
     Thread.sleep(5*60*10);
     System.out.println(new Date( ) + "\n");
     long end = System.currentTimeMillis( );
     long diff = end - start;
     System.out.println("Difference is : " + diff);
   } catch (Exception e) {
     System.out.println("Got an exception!");
   }
  }
}

這將發生以下成果:

Sun May 03 18:16:51 GMT 2009

Sun May 03 18:16:57 GMT 2009

Difference is : 5993

GregorianCalendar 類
GregorianCalendar 是一個 Calendar 類詳細的完成,即你所熟習的對正常 Gregorian 公歷的完成。本教程中不評論辯論 Calendar 類,可以看看尺度 Java 文檔。

Calendar 的 getInstance() 辦法前往與以後日期和時光默許說話情況和時區初始化的一個 GregorianCalendar。 GregorianCalendar 中界說了兩個字段:AD 和 BC。這些代表在公歷中界說的兩個時期。

也有幾個結構函數的 GregorianCalendar 對象:
SN 結構函數描寫 1 GregorianCalendar()
在默許時區與默許說話情況應用以後時光結構默許的GregorianCalendar。 2 GregorianCalendar(int year, int month, int date)
在默許時區設置默許的說話情況用給定的日期結構一個GregorianCalendar 3 GregorianCalendar(int year, int month, int date, int hour, int minute)
用給定的日期和時光設置為與默許說話情況的默許時區結構一個GregorianCalendar。 4 GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
用給定的日期和時光設置為與默許說話情況的默許時區結構一個 GregorianCalendar 5 GregorianCalendar(Locale aLocale)
基於以後時光與給定說話情況的默許時區構建一個GregorianCalendar。 6 GregorianCalendar(TimeZone zone)
基於以後時光,應用默許的說話情況在給定的時區構建一個GregorianCalendar。 7 GregorianCalendar(TimeZone zone, Locale aLocale)
基於以後時光與給定說話情況的給准時區構建一個GregorianCalendar。
這裡是由 GregorianCalendar 類供給的一些有效的辦法的列表:
SN 辦法和描寫 1 void add(int field, int amount)
基於日歷的規矩,以給定的時光字段添加指定(有符號的)時光量。 2 protected void computeFields()
將UTC轉換為毫秒時光字段值. 3 protected void computeTime()
籠罩日歷轉換時光域值為UTC的毫秒. 4 boolean equals(Object obj)
這個GregorianCalendar與一個對象援用比擬. 5 int get(int field)
獲得給准時間域的值. 6 int getActualMaximum(int field)
前往該字段能夠的最年夜值,給定到以後的日期. 7 int getActualMinimum(int field)
前往該字段能夠具有的最小值,給定以後的日期. 8 int getGreatestMinimum(int field)
關於給定的字段中前往高最低值(假如有變更). 9 Date getGregorianChange()
獲得公歷更改日期. 10 int getLeastMaximum(int field)
關於給定的字段前往最低的最年夜值,假如有變更. 11 int getMaximum(int field)
前往給定字段中的最年夜值. 12 Date getTime()
獲得日歷確當前時光. 13 long getTimeInMillis()
獲得日歷確當前時光長. 14 TimeZone getTimeZone()
獲得時區. 15 int getMinimum(int field)
前往給定字段中的最小值. 16 int hashCode()
重寫hashCode. 17 boolean isLeapYear(int year)
肯定給定年份是閏年. 18 void roll(int field, boolean up)
加上或減去(上/下)的時光在給定的時光字段一個單位,不更改更年夜的字段. 19 void set(int field, int value)
設置時光字段與給定值. 20 void set(int year, int month, int date)
設置為年,月,日的值. 21 void set(int year, int month, int date, int hour, int minute)
設置為年,月,日,小時和分鐘值. 22 void set(int year, int month, int date, int hour, int minute, int second)
設置為字段的年,月,日,小時,分鐘和秒的值. 23 void setGregorianChange(Date date)
設置GregorianCalendar更改日期. 24 void setTime(Date date)
設置日歷確當前時光與給定日期. 25 void setTimeInMillis(long millis)
從給定long值設置日歷確當前時光. 26 void setTimeZone(TimeZone value)
將時區設置與給定的時區值. 27 String toString()
前往此日歷的字符串表現情勢.
示例

import java.util.*;

public class GregorianCalendarDemo {

  public static void main(String args[]) {
   String months[] = {
   "Jan", "Feb", "Mar", "Apr",
   "May", "Jun", "Jul", "Aug",
   "Sep", "Oct", "Nov", "Dec"};

   int year;
   // Create a Gregorian calendar initialized
   // with the current date and time in the
   // default locale and timezone.
   GregorianCalendar gcalendar = new GregorianCalendar();
   // Display current time and date information.
   System.out.print("Date: ");
   System.out.print(months[gcalendar.get(Calendar.MONTH)]);
   System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
   System.out.println(year = gcalendar.get(Calendar.YEAR));
   System.out.print("Time: ");
   System.out.print(gcalendar.get(Calendar.HOUR) + ":");
   System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
   System.out.println(gcalendar.get(Calendar.SECOND));

   // Test if the current year is a leap year
   if(gcalendar.isLeapYear(year)) {
     System.out.println("The current year is a leap year");
   }
   else {
     System.out.println("The current year is not a leap year");
   }
  }
}

這將發生以下成果:

Date: Apr 22 2009
Time: 11:25:27
The current year is not a leap year

日歷小法式

上面我們來看一個日歷小法式。這裡用傳統的MVC構造,設計3個類:CalendarViewer、CalendarControlller、CalendarModel。
CalendarViewer.java重要處置UI,沿用了已有代碼,整頓之並抽出營業邏輯,使其專注於顯示層處置。
CalendarViewer.java

public class CalendarViewer extends JWindow implements ActionListener {
  JPanel calendarYmPanel = null;
  JButton leftButton = new JButton("<<");
  JButton rightButton = new JButton(">>");
  Label yearLabel = new Label();
  Label monthLabel = new Label();
  Label passedDaysLabel = new Label();
  JPanel calendarWdPanel = null;// 是caledar_week和calendar_days的總包涵體
  JPanel calendarWeekPanel = null;// 針對周列的結構
  JPanel calendarDaysPanel = null;// 針對日期列的結構
  JPanel calendarExitPanel = null;
  JButton quitButton = new JButton("封閉");
  Border emptyBorder = BorderFactory.createEmptyBorder();
 
  CalendarController cController = new CalendarController();
 
  public CalendarViewer() {
    super();
    buildUI();
  }
 
  public void buildUI() {
    buildTopPanel();
    buildCenterPanel();
    buildBottomPanel();
    setLayout(new BorderLayout());
    。。。。。。
  }
 
  private void buildTopPanel() {。。。。。。}
 
  private void buildCenterPanel() {。。。。。。}
 
  private void buildBottomPanel() {。。。。。。}
 
  public JPanel updateDaysPanel() {。。。。。。}
 
  public void updatePassedDaysLabel() {。。。。。。}
 
  public void actionPerformed(ActionEvent e) {。。。。。。}
 
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
       new CalendarViewer();
      }
    });
  }
}

UI結構重要分3塊,對應圖上中下3個panel。

  • buildTopPanel();
  • buildCenterPanel();
  • buildBottomPanel();

事宜監聽的處置由上面辦法完成。

  • actionPerformed(ActionEvent e);

基於事宜的UI更新由以下兩個辦法完成。

updateDaysPanel();
updatePassedDaysLabel();
CalendarController.java重要處置詳細的營業邏輯,而所應用的一些與詳細運用有關的日歷算法邏輯則交給CalendarModel.java。
CalendarModel.java
public class CalendarModel {
  private int daytab[][] = {
      { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
      { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
 
  public boolean isLeapYear(int year) {
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
  }
 
  public int dayOfYear(int day, int month, int year) {
    int leap = isLeapYear(year) ? 1 : 0;
    for (int i = 1; i < month; i++)
      day += daytab[leap][i];
    return day;
  }
 
  public int daysOfMonth(int month, int year) {
    int leap = isLeapYear(year) ? 1 : 0;
    return daytab[leap][month];
  }
 
  public int dayOfWeek(int day, int month, int year) {
    if (month == 1) {
      month = 13;
      year--;
    }
    if (month == 2) {
      month = 14;
      year--;
    }
    return (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year
       / 100 + year / 400) % 7 + 1;
  }
}

樹立一個二維數組,分離表現閏年與非閏年的每個月天數。重要辦法有:

  • boolean isLeapYear(int year);斷定閏年
  • dayOfYear(int day, int month, int year);盤算所供給日期為以後year的第幾天
  • daysOfMonth(int month, int year);前往以後月份的天數
  • dayOfWeek(int day, int month, int year); 盤算某年某月某日是禮拜幾,這裡應用了基姆拉爾森盤算公式。

基姆拉爾森盤算公式

  • W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
  • d 天
  • m 月
  • y 年
  • 1月2月換算為客歲的13 14月盤算
  • w=0是禮拜一,順次類推。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved