Сервлет: Обработка дат
Одно из самых важных преимуществ использования сервлетов заключается в том, что вы можете использовать большинство доступных методов в базовой Java. В этой главе будет объяснён предоставляемый Java пакетjava.util, классDate, который инкапсулирует текущую дату и время.
Класс Date поддерживает два конструктора. Первый конструктор инициализирует объект текущими датой и временем.
Date( )
Следующий конструктор принимает параметр, равный количеству миллисекунд, прошедших с полуночи 1 января 1970 года.
Date(long millisec)
Получив пригодный для использования объект Date, вы можете вызвать любой из следующих поддерживаемых методов для работы с датой:
| Порядковый номер | Метод и описание |
|---|---|
| 1 | boolean after(Date date) Возвращает true, если дата, содержащаяся в вызванном объекте Date, позже даты, указанной в date, иначе возвращает false. |
| 2 | boolean before(Date date) Возвращает true, если дата, содержащаяся в вызванном объекте Date, раньше даты, указанной в date, иначе возвращает false. |
| 3 | Object clone( ) Дублирует вызывающий объект Date. |
| 4 | int compareTo(Date date) Сравнивает значение вызывающего объекта со значением date. Возвращает 0, если два значения равны. Возвращает отрицательное значение, если вызывающий объект раньше date. Возвращает положительное значение, если вызывающий объект позже date. |
| 5 | int compareTo(Object obj) Если obj относится к классу Date, операция эквивалентна compareTo(Date). В противном случае выбрасывается ClassCastException. |
| 6 | boolean equals(Object date) Возвращает true, если время и дата, содержащиеся в вызванном объекте Date, совпадают с указанными в date, иначе возвращает false. |
| 7 | long getTime( ) Возвращает количество миллисекунд, прошедших с 1 января 1970 года. |
| 8 | int hashCode( ) Возвращает хеш-код для вызывающего объекта. |
| 9 | void setTime(long time) Устанавливает время и дату, заданные параметром time, который представляет время, прошедшее с полуночи 1 января 1970 года (в миллисекундах). |
| 10 | String toString( ) Преобразует объект Date, для которого вызван метод, в строку и возвращает результат. |
Получите текущие дату и время
Получение текущих даты и времени в Java Servlet очень легко. Вы можете использовать методtoString()обычного объекта Date, чтобы вывести текущие дату и время, как показано ниже:
package com.example.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.example.test.CurrentDate</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CurrentDate</servlet-name>
<url-pattern>/TomcatTest/CurrentDate</url-pattern>
</servlet-mapping>
</web-app>
Затем вызовите Servlet, обратившись по адресу http://localhost:8080/TomcatTest/CurrentDate. Это даст следующий результат:

Попробуйте обновить URL http://localhost:8080/TomcatTest/CurrentDate. Каждый раз, когда вы обновляете страницу через несколько секунд, вы заметите разницу в отображаемом времени.
Сравнение дат
Как упоминалось выше, в Servlet можно использовать все доступные методы Java. Если вам нужно сравнить две даты, вот методы:
- Вы можете использовать getTime(), чтобы для обоих объектов получить время, прошедшее с полуночи 1 января 1970 года (в миллисекундах), а затем сравнить эти два значения.
- Вы можете использовать методы before(), after() и equals(). Поскольку 12-е число предшествует 18-му в месяце, например, new Date(99, 2, 12).before(new Date(99, 2, 18)) возвращает true.
- Вы можете использовать метод compareTo(), который определён в интерфейсе Comparable и реализован в Date.
Используйте SimpleDateFormat для форматирования дат
SimpleDateFormat — это конкретный класс для форматирования и разбора дат с учётом локали. SimpleDateFormat позволяет выбрать любой определяемый пользователем шаблон форматирования даты и времени.
Давайте изменим приведённый выше пример следующим образом:
package com.example.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>");
}
}
Скомпилируйте вышеуказанный сервлет ещё раз, затем вызовите его, перейдя по адресу http://localhost:8080/TomcatTest/CurrentDate. Это даст следующий результат:

Коды формата Simple date format
Используйте строки шаблона времени для указания формата времени. В этом режиме все буквы ASCII зарезервированы как буквы шаблона, которые определяются следующим образом:
| Символ | Описание | Пример |
|---|---|---|
| G | Индикатор эры | AD |
| y | Год, представленный четырьмя цифрами | 2001 |
| M | Месяц в году | Июль или 07 |
| d | День в месяце | 10 |
| h | Час с A.M./P.M. (1-12) | 12 |
| H | Час в сутках (0-23) | 22 |
| m | Минута в часе | 30 |
| s | Секунда в минуте | 55 |
| S | Миллисекунда | 234 |
| E | День недели | Вторник |
| D | День года | 360 |
| F | Неделя месяца | 2 (вторая среда в июле) |
| w | Неделя года | 40 |
| W | Неделя в месяце | 1 |
| a | Маркер A.M./P.M. | PM |
| k | Час в сутках (1-24) | 24 |
| K | Час с A.M./P.M. (0-11) | 10 |
| z | Часовой пояс | Восточное стандартное время |
| ' | Экранирование текста | Разделитель |
| " | Одинарная кавычка | ` |
Полный список доступных методов работы с датами можно найти в стандартной документации Java.
Другие расширения