激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - 學習Java中的日期和時間處理及Java日歷小程序的編寫

學習Java中的日期和時間處理及Java日歷小程序的編寫

2020-04-01 14:10zhangjunhd JAVA教程

這篇文章主要介紹了學習Java中的日期和時間處理及Java日歷小程序的編寫,這個日歷小程序僅用簡單的算法實現沒有用到date類等,但是帶有圖形界面,需要的朋友可以參考下

Java 在 java.util 包中提供了 Date 類,這個類封裝了當前的日期和時間。

Date 類支持兩種構造函數。第一個構造函數初始化對象的當前日期和時間。

Date( )
下面的構造函數接收一個參數等于自1970年1月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() 方法,如下所示打印當前日期和時間:

 

?
1
2
3
4
5
6
7
8
9
10
11
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());
  }
}

這將產生以下結果:

?
1
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 允許選擇用戶定義的模式為日期時間格式。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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));
  }
}

這將產生以下結果:

?
1
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 開始并在下面給出的表格中的其中一個字母結束。例如:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
 }
}

這將產生以下結果:

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

如果提供日期多次格式化是一種不好的做法。一個格式字符串可以指示要格式化的參數的索引。
索引必須緊跟在 % 之后,并必須由 $ 終止。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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);
  }
}

這將產生以下結果:

?
1
Due date: February 09, 2004

或者,也可以使用 < 標志。則表示相同的參數,根據前述格式規范,應再次使用。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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);
  }
}

這將產生以下結果:

?
1
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 的對象的格式來轉換字符串。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
   }
  }
}

上述程序的運行示例將產生以下結果:

?
1
2
3
4
$ 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秒:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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!");
   }
  }
}

這將產生以下結果:

?
1
2
3
Sun May 03 18:04:41 GMT 2009
 
Sun May 03 18:04:51 GMT 2009

測量執行時間
有時候,可能需要測量的時間點以毫秒為單位。因此,讓我們再一次重新寫上面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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!");
   }
  }
}

這將產生以下結果:

?
1
2
3
4
5
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()
返回此日歷的字符串表示形式.

示例

 

?
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
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");
   }
  }
}

這將產生以下結果:

?
1
2
3
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

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

 

學習Java中的日期和時間處理及Java日歷小程序的編寫

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

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

事件監聽的處理由下面方法完成。

  • actionPerformed(ActionEvent e);

基于事件的UI更新由以下兩個方法完成。

?
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
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是星期一,依次類推。

延伸 · 閱讀

精彩推薦
  • JAVA教程java中如何獲取相關參數

    java中如何獲取相關參數

    這篇文章主要介紹了java獲取系統屬性相關參數的方法,,需要的朋友可以參考下 ...

    uiuasdin2222019-12-27
  • JAVA教程Java中常見的5種WEB服務器介紹

    Java中常見的5種WEB服務器介紹

    這篇文章主要介紹了Java中常見的5種WEB服務器介紹,它們分別是Tomcat、Resin、JBoss、WebSphere、WebLogic,需要的朋友可以參考下 ...

    junjie3002019-11-24
  • JAVA教程Java如何利用Mybatis進行數據權限控制詳解

    Java如何利用Mybatis進行數據權限控制詳解

    這篇文章主要介紹了Java如何利用Mybatis進行數據權限控制詳解,數據權限控制最終的效果是會要求在同一個數據請求方法中,根據不同的權限返回不同的數據...

    陳晨_軟件五千言5112019-06-27
  • JAVA教程Java數據結構及算法實例:漢諾塔問題 Hanoi

    Java數據結構及算法實例:漢諾塔問題 Hanoi

    這篇文章主要介紹了Java數據結構及算法實例:漢諾塔問題 Hanoi,本文直接給出實現代碼,代碼中包含大量注釋,需要的朋友可以參考下 ...

    junjie2512019-12-24
  • JAVA教程深入解析Java編程中的抽象類

    深入解析Java編程中的抽象類

    這篇文章主要介紹了Java編程中的抽象類,抽象類體現了Java面向對象編程的特性,需要的朋友可以參考下 ...

    IT小于4922020-01-12
  • JAVA教程Java實現的Windows資源管理器實例

    Java實現的Windows資源管理器實例

    這篇文章主要介紹了Java實現的Windows資源管理器,實例分析了基于java實現windows資源管理器的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    華宰1372019-12-27
  • JAVA教程Java中遞歸原理實例分析

    Java中遞歸原理實例分析

    這篇文章主要介紹了Java中遞歸原理,實例分析了java中遞歸的原理與實現方法,以及使用過程中的相關技巧,需要的朋友可以參考下 ...

    一羽清寧4362019-12-18
  • JAVA教程JDBC用法小結

    JDBC用法小結

    這篇文章主要介紹了JDBC用法,較為詳細的分析了基于JDBC進行數據庫操作的技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    shichen20143192019-12-07
321
主站蜘蛛池模板: 91成人免费网站 | 国产乱一区二区三区视频 | 中文字幕一区在线观看视频 | av电影网站在线 | 亚洲二区三区在线 | 精品国产精品久久 | 国产扩阴视频 | 99精品国产小情侣高潮露脸在线 | 51国产偷自视频区视频小蝌蚪 | 欧美成人精品一级 | 有一婷婷色| 免费在线中文字幕 | 免费黄网站在线播放 | 黄色av网站在线观看 | 免费黄色的视频 | 国产一区二区三区四区波多野结衣 | 欧美 中文字幕 | 国产精品麻豆一区二区三区 | 香蕉国产精品 | 伊人99在线 | 黄色伊人网站 | 亚州精品国产 | 一区国产在线观看 | 国产亚洲精品一区二区三区 | 欧美日韩大片在线观看 | xnxx18日本 | www.国产.com| 久草免费资源视频 | 欧美三级欧美成人高清www | 久久久久性视频 | 精品午夜影院 | 91久久综合 | 久久影院午夜 | 182tv成人福利视频免费看 | 一级毛片免费大片 | 九九热精| 99视频网址 | 最近日本电影hd免费观看 | 欧美淫交 | 黄网站在线免费 | 亚洲精品午夜视频 |