JSP วันที่และเวลาปัจจุบัน

⚡ สรุปอย่างชาญฉลาด

การจัดการวันที่ของ JSP อาศัยแกนหลักพื้นฐาน Javaดังนั้น คลาส java.util.Date และคอนสตรัคเตอร์ของคลาสนี้จึงสามารถเรียกได้โดยตรงจากสคริปต์เล็ตหรือแท็กนิพจน์ เพื่อแสดงวันที่และเวลาปัจจุบันบนหน้าเว็บ

  • 🔘 ความได้เปรียบ: ทุกวิธีการของแกนหลัก Java ยังคงใช้งานได้ภายในหน้า JSP โดยไม่ต้องตั้งค่าเพิ่มเติม
  • ☑️ ตัวสร้าง: ฟังก์ชัน Date() จะส่งคืนค่าช่วงเวลาปัจจุบัน ในขณะที่ Date(long) จะสร้างช่วงเวลาขึ้นใหม่จากมิลลิวินาทีตั้งแต่ปี 1970
  • วิธีการ: เมธอด after, before, compareTo, equals, getTime, setTime และ toString ครอบคลุมการเปรียบเทียบส่วนใหญ่แล้ว
  • 🧪 แท็กนิพจน์: แท็กแสดงผลเพียงแท็กเดียวจะพิมพ์อ็อบเจ็กต์วันที่ลงใน HTML ที่สร้างขึ้นโดยตรง
  • 🛠️ การจัดรูปแบบ: SimpleDateFormat และแท็ก formatDate ของ JSTL ควบคุมวิธีการแสดงค่าอย่างแม่นยำ
  • 📊 API สมัยใหม่: คลาส java.time เช่น LocalDateTime จะเข้ามาแทนที่เมธอด Date เดิมที่ถูกทำเครื่องหมายว่าเลิกใช้งานแล้ว

JSP วันที่และเวลาปัจจุบัน

การจัดการวันที่ 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()) %> แทน. <%= %> แท็กแสดงผลยังคงไม่เปลี่ยนแปลง

เมื่อคุณรันโค้ดข้างต้น คุณจะได้ผลลัพธ์ดังต่อไปนี้

การแสดงผลหน้าเว็บ JSP ในเบราว์เซอร์ที่แสดงวันที่และเวลาปัจจุบัน

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() ก่อนที่วิธีการกำหนดวันที่ใดๆ จะยอมรับได้

คำถามที่พบบ่อย

java.util, เพิ่ม <%@ page import="java.util.*" %> ที่ด้านบนของหน้า หรือเขียนคุณวุฒิครบถ้วน java.util.Date ภายในแท็ก expression ซึ่งเป็นสิ่งที่ตัวอย่างในหน้านี้ทำ

ผู้ช่วย AI สามารถแปลรูปแบบข้อความให้เป็นภาษาอังกฤษธรรมดา และแปลงข้อความเก่าให้เป็นข้อความใหม่ได้ Date ส่วนหนึ่งของข้อความถูกแปลงเป็น java.timeและชี้ให้เห็นปัญหาเรื่องความปลอดภัยของเธรดในตัวจัดรูปแบบที่ใช้ร่วมกัน ทดสอบข้อเสนอแนะ เพราะตัวอักษรรูปแบบที่ไม่ถูกต้องยังคงคอมไพล์ได้อย่างไม่มีปัญหา

ใช่. นักบิน GitHub เติมเต็มสคริปต์และคำสั่ง taglib จากความคิดเห็น ตรวจสอบ JSTL uri มันสร้างขึ้นมา เนื่องจากโดยส่วนใหญ่มักจะตั้งค่าเริ่มต้นเป็นเวอร์ชันเก่ากว่า java.sun.com คุณค่ามากกว่าคุณค่าของจาการ์ตา

new Date() อ่านเวลาและโซนเวลาเริ่มต้นของเซิร์ฟเวอร์ที่รันหน้าเว็บ ส่งโซนเวลาที่ระบุอย่างชัดเจนไปยังตัวจัดรูปแบบ หรือแปลงค่าที่ฝั่งไคลเอนต์ หากเวลาท้องถิ่นของผู้เข้าชมเป็นสิ่งสำคัญ

getTime() ส่งคืน a longจำนวนมิลลิวินาทีที่ผ่านไปนับตั้งแต่วันที่ 1 มกราคม 1970 toString() ส่งคืนสตริงที่อ่านได้ซึ่งสร้างขึ้นจากภาษาท้องถิ่นเริ่มต้น เก็บตัวเลขและแสดงผลเป็นสตริง

ไม่ คลาสนี้ยังคงได้รับการสนับสนุน แต่ตัวเข้าถึงฟิลด์ส่วนใหญ่ของคลาสนี้มีคำเตือนเรื่องการเลิกใช้งานตั้งแต่ JDK 1.1 แล้ว คาดว่าโค้ดใหม่จะใช้ java.timeและ Date.from() เชื่อมต่อ API ทั้งสองเข้าด้วยกัน

ใช่แล้ว ประกาศอ็อบเจ็กต์ด้วย <jsp:useBean> และแสดงผลด้วย JSTL <fmt:formatDate> แท็กนี้ไม่จำเป็นต้องใช้สคริปต์เล็ต ทำให้โค้ดอ่านง่ายและบำรุงรักษาได้ง่ายขึ้น

แท็กการแสดงออก <%= %>ไม่ว่ามันจะประกอบด้วยอะไร มันก็จะถูกประเมินและ... toString() ผลลัพธ์จะถูกเขียนลงในส่วนตอบกลับ ซึ่งเป็นวิธีที่หน้าตัวอย่างแสดงวันที่ในบรรทัดเดียว

สรุปโพสต์นี้ด้วย: