Servlet 日付の処理
Servlet を使用する最も重要な利点の1つは、コア Java で利用可能なほとんどのメソッドを使用できることです。この章では、Java が提供するjava.utilパッケージ内のDateクラスについて説明します。このクラスは現在の日付と時刻をカプセル化しています。
Date クラスは 2 つのコンストラクタをサポートします。最初のコンストラクタは現在の日付と時刻のオブジェクトを初期化します。
Date( )
次のコンストラクタは、1970 年 1 月 1 日午前 0 時からの経過ミリ秒数に等しいパラメータを受け取ります。
Date(long millisec)
利用可能な Date オブジェクトがあれば、次のいずれかのサポートされているメソッドを呼び出して日付を使用できます:
| 番号 | メソッド & 説明 |
|---|---|
| 1 | boolean after(Date date) 呼び出された Date オブジェクトに含まれる日付が、date で指定された日付より後の場合は true を返し、それ以外の場合は false を返します。 |
| 2 | boolean before(Date date) 呼び出された Date オブジェクトに含まれる日付が、date で指定された日付より前の場合は true を返し、それ以外の場合は false を返します。 |
| 3 | Object clone( ) Date オブジェクトを複製します。 |
| 4 | int compareTo(Date date) 呼び出しオブジェクトの値を date の値と比較します。2 つの値が等しい場合は 0 を返します。呼び出しオブジェクトが date より前の場合は負の値を返します。呼び出しオブジェクトが date より後の場合は正の値を返します。 |
| 5 | int compareTo(Object obj) obj が Date クラスの場合、操作は compareTo(Date) と同等です。それ以外の場合は、ClassCastException をスローします。 |
| 6 | boolean equals(Object date) 呼び出された Date オブジェクトに含まれる時刻と日付が date で指定されたものと同じ場合は true を返し、それ以外の場合は false を返します。 |
| 7 | long getTime( ) 1970 年 1 月 1 日からの経過ミリ秒数を返します。 |
| 8 | int hashCode( ) 呼び出しオブジェクトのハッシュコードを返します。 |
| 9 | void setTime(long time) time で指定された時刻と日付を設定します。これは、1970 年 1 月 1 日午前 0 時からの経過時間(ミリ秒単位)を表します。 |
| 10 | String toString( ) 呼び出された Date オブジェクトを文字列に変換し、結果を返します。 |
現在の日付と時刻を取得する
Java Servlet で現在の日付と時刻を取得するのは非常に簡単です。単純な Date オブジェクトのtoString()メソッドを使用して現在の日付と時刻を出力できます。次に示すとおりです:
package com.サンプル.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CurrentDate
*/
@WebServlet("/CurrentDate")
public class CurrentDate extends HttpServlet {
private static final long serialVersionUID = 1L;
public CurrentDate() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "显示当前的日期和时间";
Date date = new Date();
String docType = "<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#F0F0F0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<h2 align=\"center\">" + date.toString() + "</h2>\n" +
"</body></html>");
}
}
それでは、上記の Servlet をコンパイルし、web.xml ファイルに適切なエントリを作成しましょう:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>CurrentDate</servlet-name>
<servlet-class>com.サンプル.test.CurrentDate</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CurrentDate</servlet-name>
<url-pattern>/TomcatTest/CurrentDate</url-pattern>
</servlet-mapping>
</web-app>
次に、http://localhost:8080/TomcatTest/CurrentDate にアクセスしてこの Servlet を呼び出します。これにより、次のような結果が生成されます:

URL http://localhost:8080/TomcatTest/CurrentDate を更新してみてください。数秒ごとに更新すると、表示される時間に違いがあることがわかります。
日付の比較
上で述べたように、Servlet では利用可能なすべての Java メソッドを使用できます。2 つの日付を比較する必要がある場合、方法は次のとおりです:
- getTime() を使用して、2 つのオブジェクトの 1970 年 1 月 1 日午前 0 時からの経過時間(ミリ秒単位)を取得し、これら 2 つの値を比較できます。
- before()、after()、equals() メソッドを使用できます。1 か月の中で 12 日は 18 日より前にあるため、たとえば、new Date(99, 2, 12).before(new Date (99, 2, 18)) は true を返します。
- compareTo() メソッドを使用できます。このメソッドは Comparable インターフェースで定義され、Date によって実装されています。
SimpleDateFormat を使用して日付をフォーマットする
SimpleDateFormat は、ロケールに依存した方法で日付をフォーマットおよび解析する具象クラスです。SimpleDateFormat を使用すると、ユーザー定義の日時フォーマットパターンを任意に選択できます。
上記の例を次のように変更してみましょう:
package com.サンプル.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CurrentDate
*/
@WebServlet("/CurrentDate")
public class CurrentDate extends HttpServlet {
private static final long serialVersionUID = 1L;
public CurrentDate() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "显示当前的日期和时间";
Date dNow = new Date( );
SimpleDateFormat ft =
new SimpleDateFormat ("yyyy.MM.dd hh:mm:ss E a ");
String docType = "<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#F0F0F0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<h2 align=\"center\">" + ft.format(dNow) + "</h2>\n" +
"</body></html>");
}
}
上記の Servlet を再度コンパイルし、http://localhost:8080/TomcatTest/CurrentDate にアクセスしてこの Servlet を呼び出します。これにより、次のような結果が生成されます:

単純な日付形式のフォーマットコード
パターン文字列を使用して時刻形式を指定します。このモードでは、すべての ASCII 文字がパターン文字として予約されており、これらの文字は次のように定義されています:
| 文字 | 説明 | 例 |
|---|---|---|
| G | Era インジケーター | AD |
| y | 4 桁で表される年 | 2001 |
| M | 年の中の月 | July または 07 |
| d | 月の中の日 | 10 |
| h | A.M./P.M. 付きの時間(1〜12) | 12 |
| H | 1 日の時間(0〜23) | 22 |
| m | 1 時間の中の分 | 30 |
| s | 1 分の中の秒 | 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 日の時間(1〜24) | 24 |
| K | A.M./P.M. 付きの時間(0〜11) | 10 |
| z | タイムゾーン | Eastern Standard Time |
| ' | Escape for text | Delimiter |
| " | 一重引用符 | ` |
利用可能な日付処理メソッドの完全なリストを確認するには、標準の Java ドキュメントを参照してください。
その他の拡張