Aktuální datum a čas JSP

⚡ Chytré shrnutí

Zpracování dat v JSP se spoléhá na prosté jádro Java, takže třídu java.util.Date a její konstruktory lze volat přímo ze skriptletu nebo tagu výrazu pro výpis aktuálního data a času na stránku.

  • 🔘 Výhoda: Každá metoda jádra Java zůstává k dispozici uvnitř JSP stránky bez další konfigurace.
  • ☑️ Konstruktéři: Funkce Date() vrací aktuální okamžik, zatímco funkce Date(long) znovu sestaví okamžik z milisekund od roku 1970.
  • (Tj. Metody: Funkce after, before, compareTo, equals, getTime, setTime a toString pokrývají většinu porovnávacích operací.
  • 🧪 Výrazový štítek: Jeden tag výrazu vytiskne objekt data přímo do vygenerovaného HTML.
  • 🛠️ Formátování: SimpleDateFormat a tag JSTL formatDate přesně určují, jak se hodnota zobrazuje.
  • 📊 Moderní API: Třídy java.time, jako například LocalDateTime, nahrazují starší metody Date označené jako zastaralé.

Aktuální datum a čas JSP

JSP Date Handling

Největší výhodou JSP je, že všechny metody jádra Java lze použít v JSP.

V této části budeme používat Date třídy java.util balíček, který obsahuje datum i čas v jednom objektu. Třída je k dispozici na každém JSP page, jakmile je balíček importován pomocí direktivy page.

Podporuje dva konstruktory:

Stavitel Co to dělá
Date() Udává nám aktuální datum a čas.
Date(long millisec) Toto bere parametr milisekund, které uplynuly od 1. ledna 1970.

Jedno Date třída také zpřístupňuje níže uvedené metody. Java Primitivní návratové typy se píší malými písmeny, a tak se zobrazují i ​​v Java API.

Metoda Description
boolean after(Date date) Určuje, zda toto datum spadá po daném parametru data.
boolean before(Date date) Určuje, zda toto datum předchází danému parametru data.
Object clone() Vytvoří kopii objektu data.
int compareTo(Date date) Porovnává objekt třídy date s jiným objektem.
int compareTo(Object date) Porovnává objekt třídy object s jiným objektem. Toto přetížení patří do pre-generického API; aktuální Java pouze odhaluje compareTo(Date).
boolean equals(Object date) Kontroluje, zda jsou dva objekty data stejné.
long getTime() Načítá čas v milisekundách od 1. ledna 1970.
int hashCode() Načte hash kód daného data.
void setTime(long time) Nastavuje čas daného objektu data.
String toString() Převede objekt data na objekt typu string.

Poznámka: přístupové objekty polí této třídy, jako například getYear(), getMonth() a toLocaleString(), jsou od verze JDK 1.1 zastaralé. Samotná třída stále funguje, ale očekává se, že nový kód bude používat Calendar, DateFormat, Nebo java.time třídy popsané dále na této stránce.

Příklad: Zobrazení aktuálního data a času v JSP

Příklad:

V tomto příkladu načítáme aktuální datum a čas pomocí objektu 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>

Vysvětlení kódu:

Code Řádek 11: K načtení aktuálního data a času používáme objekt data.

Moderní ekvivalent: Výše uvedený kód je zachován přesně tak, jak byl publikován. toLocaleString() byl nahrazen DateFormat.format(Date date) od verze JDK 1.1, takže aktuální stránka by psala <%= java.text.DateFormat.getDateTimeInstance().format(new java.util.Date()) %> namísto. <%= %> Samotný tag výrazu zůstává nezměněn.

Když spustíte výše uvedený kód, získáte následující výstup.

Výstup prohlížeče na stránce JSP s aktuálním datem a časem

Výstup:

Získáváme aktuální datum a čas.

Jak formátovat datum a čas v JSP

Tisk Date Objekt přímo vrací to, co vygeneruje výchozí locale, což je zřídka formát, který stránka potřebuje. Výstup řídí dva přístupy.

První zachovává logiku Java a použití SimpleDateFormat, kde každé písmeno vzoru představuje jednu část hodnoty.

<%@ 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 %>
Vzor písmene Význam Příklad
yyyy Čtyřmístný rok 2026
MM Číslo měsíce 07
dd den v měsíci 29
HH Hodina, 24hodinový formát 18
mm Minuty 45
ss Sekundy 02

Druhý přístup udržuje stránku bez Java kód a místo toho používá formátovací knihovnu JSTL, která se dobře hodí k ostatním Značky akcí 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" />

Jedno uri Výše uvedená hodnota je formát JSTL 3.0 používaný systémem Jakarta EE 10 a novějšími verzemi. Stránky běžící na starším kontejneru stále používají http://java.sun.com/jsp/jstl/fmta kontejnery nadále přijímají starší URI z důvodu kompatibility. type atribut vybírá date, timenebo both, Zatímco dateStyle, timeStyle a timeZone upřesnit výsledek.

Zpracování dat pomocí API Java.time v JSP

Java 8 představil java.time balíček a nyní je to doporučený způsob práce s daty v jakémkoli Java kód, včetně stránky JSP. Na rozdíl od DateTyto třídy jsou neměnné a bezpečné pro práci z více vláken, takže jeden formátovací modul lze bezpečně sdílet mezi požadavky.

<%@ 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) %>

Vyberte třídu, která odpovídá tomu, co stránka skutečně potřebuje:

  • LocalDate — datum bez časového údaje, například datum narození.
  • LocalTime — čas bez data, například otevírací doba.
  • LocalDateTime — datum a čas bez připojeného časového pásma.
  • ZonedDateTime — například datum a čas vázané na určitou zónu ZoneId.of("Asia/Kolkata").
  • Instant — časové razítko stroje, nejbližší shoda s tím, co getTime() vrátí se.

Stávající kód není nutné přepisovat najednou, protože Date.from(instant) a date.toInstant() převádět mezi těmito dvěma API.

Běžné chyby při zpracování dat v JSP

Datum, které se na vývojářském počítači vytiskne správně, může být v produkčním prostředí stále chybné. Níže uvedené chyby vysvětlují většinu těchto hlášení.

  • Chybí import: použitím Date bez <%@ page import="java.util.*" %> kompilace se nepodaří, pokud není plně kvalifikovaný java.util.Date je zapsáno, jak je uvedeno v příkladu na této stránce.
  • Špatný vzor písmen: mm je minut a MM je měsíců a DD je den v roce, nikoli den v měsíci.
  • Časové pásmo serveru: new Date() odráží čas serveru, nikoli návštěvníka. Nastavte timeZone na formátovacím tagu, když se cílová skupina nachází jinde.
  • Sdílení SimpleDateFormat: Třída není bezpečná pro přístup z více vláken, takže statická instance sdílená napříč požadavky může vrátit poškozený výstup. Vytvořte jednu instanci pro každý požadavek nebo použijte DateTimeFormatter.
  • Prázdná stránka po aktualizaci: kontejner na Jakartě EE 10 odmítá starý javax JSTL JAR soubory, takže formátovací tag se vykreslí jako doslovný text, dokud nebudou na místě artefakty Jakarty.
  • Formátování řetězce: Hodnota získaná z parametru požadavku je text a musí být analyzována pomocí parse() než to jakákoli metoda data přijme.

Nejčastější dotazy

java.util, přidat <%@ page import="java.util.*" %> v horní části stránky nebo napište plně kvalifikovaný java.util.Date uvnitř tagu výrazu, což dělá i příklad na této stránce.

Asistenti s umělou inteligencí dokáží přeložit formátovací vzor do jednoduché angličtiny, převést starší Date úryvek do java.timea poukázat na problém s bezpečností vláken ve sdíleném formátovači. Otestujte návrh, protože i špatné vzorové písmeno se stále čistě zkompiluje.

Ano. GitHub Copilot dokončí skriptlety a direktivy taglib z komentáře. Zkontrolujte JSTL. uri produkuje, protože se často automaticky vrací ke starší verzi java.sun.com hodnotu spíše než tu z Jakarty.

new Date() Přečte hodiny a výchozí zónu serveru, na kterém je stránka spuštěna. Pokud je důležitý místní čas návštěvníka, předejte formátovači explicitní zónu nebo ji převeďte na straně klienta.

getTime() vrací long: milisekundy uplynulé od 1. ledna 1970. toString() Vrací čitelný řetězec sestavený z výchozího locale. Uloží číslo, zobrazí řetězec.

Ne. Třída zůstává podporována, ale většina jejích přístupových metod k polím má od verze JDK 1.1 varování před zastaráním. Očekává se, že nový kód bude používat java.time, a Date.from() propojuje dvě API.

Ano. Deklarujte objekt pomocí <jsp:useBean> a vykreslete to pomocí JSTL <fmt:formatDate> tag. Není vyžadován žádný skriptlet, což udržuje kód čitelný a snadněji se udržuje.

Výrazový tag <%= %>Ať už obsahuje cokoli, je vyhodnoceno a jeho toString() Výsledek se zapíše do odpovědi, což je způsob, jakým vzorová stránka vytiskne datum na jeden řádek.

Shrňte tento příspěvek takto: