JSP วันที่และเวลาปัจจุบัน
⚡ สรุปอย่างชาญฉลาด
การจัดการวันที่ของ JSP อาศัยแกนหลักพื้นฐาน Javaดังนั้น คลาส java.util.Date และคอนสตรัคเตอร์ของคลาสนี้จึงสามารถเรียกได้โดยตรงจากสคริปต์เล็ตหรือแท็กนิพจน์ เพื่อแสดงวันที่และเวลาปัจจุบันบนหน้าเว็บ
การจัดการวันที่ JSP
ข้อได้เปรียบที่สำคัญที่สุดของ JSP คือ เมธอดหลักทั้งหมด Java สามารถใช้ใน JSP ได้
ในส่วนนี้ เราจะใช้ Date ชั้นเรียนของ java.util แพ็กเกจที่เก็บทั้งวันที่และเวลาไว้ในอ็อบเจ็กต์เดียว คลาสนี้สามารถใช้งานได้บนทุกอุปกรณ์ JSP จะแสดงหน้าเว็บทันทีที่นำเข้าแพ็กเกจโดยใช้คำสั่ง page directive
รองรับคอนสตรัคเตอร์สองตัว:
| นวกรรมิก | สิ่งที่มันไม่ |
|---|---|
Date() |
มันแสดงวันที่และเวลาปัจจุบันให้เราทราบ |
Date(long millisec) |
ฟังก์ชันนี้รับค่าพารามิเตอร์เป็นมิลลิวินาทีที่ผ่านไปนับตั้งแต่วันที่ 1 มกราคม 1970 |
การขอ Date คลาสนี้ยังเปิดเผยเมธอดต่างๆ ที่ระบุไว้ด้านล่างด้วย Java ประเภทค่าส่งคืนพื้นฐานจะเขียนด้วยตัวพิมพ์เล็ก ซึ่งเป็นลักษณะที่ปรากฏในรูปแบบต่างๆ Java API
| วิธี | Descriptไอออน |
|---|---|
boolean after(Date date) |
ฟังก์ชันนี้จะบอกว่าวันที่นี้อยู่หลังจากวันที่ที่ระบุในพารามิเตอร์หรือไม่ |
boolean before(Date date) |
ฟังก์ชันนี้จะบอกว่าวันที่นี้อยู่ก่อนวันที่ที่ระบุในพารามิเตอร์หรือไม่ |
Object clone() |
ฟังก์ชันนี้จะสร้างสำเนาของอ็อบเจ็กต์วันที่ |
int compareTo(Date date) |
มันเปรียบเทียบอ็อบเจ็กต์คลาสวันที่กับอ็อบเจ็กต์อื่น |
int compareTo(Object date) |
มันเปรียบเทียบอ็อบเจ็กต์คลาสหนึ่งกับอีกอ็อบเจ็กต์หนึ่ง โอเวอร์โหลดนี้เป็นส่วนหนึ่งของ API ก่อนเจเนริกส์ ปัจจุบัน Java เปิดเผยเพียง compareTo(Date). |
boolean equals(Object date) |
ฟังก์ชันนี้จะตรวจสอบว่าอ็อบเจ็กต์วันที่สองรายการเท่ากันหรือไม่ |
long getTime() |
ฟังก์ชันนี้แสดงเวลาเป็นมิลลิวินาที นับตั้งแต่วันที่ 1 มกราคม 1970 |
int hashCode() |
ฟังก์ชันนี้จะดึงค่าแฮชของวันที่ที่กำหนด |
void setTime(long time) |
ฟังก์ชันนี้ใช้สำหรับตั้งเวลาของอ็อบเจ็กต์วันที่ที่กำหนด |
String toString() |
ฟังก์ชันนี้จะแปลงอ็อบเจ็กต์วันที่ให้เป็นอ็อบเจ็กต์สตริง |
หมายเหตุ ตัวเข้าถึงฟิลด์ของคลาสนี้ เช่น getYear(), getMonth() และ toLocaleString()คลาสดังกล่าวถูกยกเลิกการใช้งานแล้วตั้งแต่ JDK 1.1 ตัวคลาสเองยังคงใช้งานได้ แต่คาดว่าโค้ดใหม่จะใช้คลาสอื่นแทน Calendar, DateFormatหรือ java.time รายละเอียดของคลาสต่างๆ จะอธิบายไว้ในส่วนถัดไปของหน้านี้
ตัวอย่าง: แสดงวันที่และเวลาปัจจุบันใน JSP
ตัวอย่าง:
ในตัวอย่างนี้ เรากำลังดึงวันที่และเวลาปัจจุบันโดยใช้ object ประเภท date
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="java.util.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Guru current Date</title> </head> <body> Today's date: <%= (new java.util.Date()).toLocaleString()%> </body> </html>
คำอธิบายของรหัส:
Code 11 แนว: เรากำลังใช้วัตถุ date เพื่อดึงวันที่และเวลาปัจจุบัน
เทียบเท่าในยุคปัจจุบัน: โค้ดด้านบนยังคงเหมือนเดิมทุกประการตามที่เผยแพร่ไว้ toLocaleString() ถูกแทนที่ด้วย DateFormat.format(Date date) ตั้งแต่ JDK 1.1 เป็นต้นไป หน้าเว็บปัจจุบันจะเขียนว่า <%= java.text.DateFormat.getDateTimeInstance().format(new java.util.Date()) %> แทน. <%= %> แท็กแสดงผลยังคงไม่เปลี่ยนแปลง
เมื่อคุณรันโค้ดข้างต้น คุณจะได้ผลลัพธ์ดังต่อไปนี้
Output:
เรากำลังตรวจสอบวันที่และเวลาปัจจุบัน
วิธีการจัดรูปแบบวันที่และเวลาใน JSP
การพิมพ์ Date อ็อบเจ็กต์จะแสดงผลตามรูปแบบที่ภาษาท้องถิ่นเริ่มต้นสร้างขึ้น ซึ่งส่วนใหญ่ไม่ใช่รูปแบบที่หน้าเว็บต้องการ มีสองวิธีในการควบคุมผลลัพธ์
วิธีแรกจะคงตรรกะเอาไว้ Java และการใช้งาน SimpleDateFormatโดยที่ตัวอักษรแต่ละตัวในรูปแบบนั้นแทนส่วนหนึ่งของค่า
<%@ page import="java.util.*, java.text.*" %> <% SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String today = fmt.format(new Date()); %> Today's date: <%= today %>
| ตัวอักษรแบบแผน | ความหมาย | ตัวอย่าง |
|---|---|---|
yyyy |
ปีสี่หลัก | 2026 |
MM |
หมายเลขเดือน | 07 |
dd |
วันของเดือน | 29 |
HH |
ชั่วโมง, นาฬิกา 24 ชั่วโมง | 18 |
mm |
นาที | 45 |
ss |
วินาที | 02 |
แนวทางที่สองทำให้หน้าเว็บปราศจากสิ่งใดๆ Java โค้ดนี้ใช้ไลบรารีการจัดรูปแบบ JSTL แทน ซึ่งเข้ากันได้ดีกับส่วนอื่นๆ แท็กแอ็กชัน JSP.
<%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %> <jsp:useBean id="now" class="java.util.Date" /> <fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss" />
การขอ uri ค่าที่แสดงด้านบนคือรูปแบบ JSTL 3.0 ที่ใช้โดย Jakarta EE 10 และเวอร์ชันที่ใหม่กว่า หน้าเว็บที่ทำงานบนคอนเทนเนอร์เวอร์ชันเก่ากว่ายังคงใช้รูปแบบนี้อยู่ http://java.sun.com/jsp/jstl/fmtและคอนเทนเนอร์ยังคงยอมรับ URI เวอร์ชันเก่าเพื่อความเข้ากันได้ type การเลือกคุณลักษณะ date, timeหรือ bothในขณะที่ dateStyle, timeStyle และ timeZone ปรับปรุงผลลัพธ์ให้ดียิ่งขึ้น
การจัดการวันที่ด้วย API java.time ใน JSP
Java 8 ได้แนะนำ java.time แพ็กเกจ และปัจจุบันเป็นวิธีที่แนะนำในการทำงานกับวันที่ในทุกกรณี Java โค้ด รวมถึงหน้า JSP ซึ่งแตกต่างจาก Dateคลาสเหล่านี้เป็นแบบไม่เปลี่ยนแปลงและปลอดภัยต่อการใช้งานแบบมัลติเธรด ดังนั้นจึงสามารถใช้ตัวจัดรูปแบบเดียวร่วมกันได้อย่างปลอดภัยในการร้องขอต่างๆ
<%@ page import="java.time.*, java.time.format.*" %> <% LocalDateTime now = LocalDateTime.now(); DateTimeFormatter f = DateTimeFormatter.ofPattern("dd MMM yyyy HH:mm"); %> Today's date: <%= f.format(now) %>
เลือกคลาสที่ตรงกับความต้องการของหน้าเว็บนั้น ๆ:
LocalDate— วันที่ที่ไม่มีเวลาระบุ เช่น วันเกิดLocalTime— เวลาที่ไม่มีระบุวันที่ เช่น เวลาเปิดทำการLocalDateTime— วันที่และเวลาโดยไม่มีการระบุเขตเวลาZonedDateTime— เช่น วันและเวลาที่กำหนดภายในเขตเวลาใดเวลาหนึ่งZoneId.of("Asia/Kolkata").Instant— การประทับเวลาของเครื่องจักร การจับคู่ที่ใกล้เคียงที่สุดกับสิ่งที่getTime()ผลตอบแทน
ไม่จำเป็นต้องเขียนโค้ดที่มีอยู่ใหม่ทั้งหมดในคราวเดียว เพราะ Date.from(instant) และ date.toInstant() แปลงระหว่าง API ทั้งสองแบบ
ข้อผิดพลาดทั่วไปในการจัดการวันที่ใน JSP
วันที่ที่พิมพ์ออกมาถูกต้องบนเครื่องทดสอบอาจยังผิดพลาดได้ในระบบการผลิต ข้อผิดพลาดด้านล่างนี้เป็นสาเหตุหลักของรายงานเหล่านั้น
- การนำเข้าไม่สำเร็จ: ด้วย
Dateไม่มี<%@ page import="java.util.*" %>การคอมไพล์จะไม่สำเร็จ เว้นแต่จะใช้คุณสมบัติครบถ้วนjava.util.Dateเขียนออกมาเป็นข้อความ ดังตัวอย่างในหน้านี้ - ตัวอักษรแบบผิด:
mmเป็นนาทีและMMเป็นเวลาหลายเดือน และDDเป็นวันในรอบปี ไม่ใช่วันในเดือน - เขตเวลาของเซิร์ฟเวอร์:
new Date()แสดงเวลาของเซิร์ฟเวอร์ ไม่ใช่เวลาของผู้เยี่ยมชม ตั้งค่าtimeZoneบนแท็กการจัดรูปแบบเมื่อกลุ่มเป้าหมายอยู่ที่อื่น - การแชร์ SimpleDateFormat: คลาสนี้ไม่ปลอดภัยต่อการใช้งานแบบมัลติเธรด ดังนั้นอินสแตนซ์แบบคงที่ที่ใช้ร่วมกันระหว่างการร้องขออาจส่งคืนผลลัพธ์ที่เสียหาย สร้างอินสแตนซ์หนึ่งรายการต่อการร้องขอแต่ละครั้ง หรือใช้
DateTimeFormatter. - หน้าว่างเปล่าหลังจากอัปเกรด: ตู้คอนเทนเนอร์บนเส้นทาง EE 10 ของจาการ์ตา ปฏิเสธสินค้าเก่า
javaxไฟล์ JSTL jar นั้นทำให้แท็กการจัดรูปแบบแสดงผลเป็นข้อความตามตัวอักษรจนกว่าไฟล์ Jakarta จะพร้อมใช้งาน - การจัดรูปแบบข้อความ: ค่าที่ดึงมาจากพารามิเตอร์คำขอเป็นข้อความและต้องได้รับการแยกวิเคราะห์ด้วย
parse()ก่อนที่วิธีการกำหนดวันที่ใดๆ จะยอมรับได้

