tl;博士
java.time.LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
避免使用旧的日期时间类
Calendar.getInstance() 和 new Date() 都捕捉当前时刻。所以你要么是:
更重要的是,您正在使用 可怕 日期时间类,这些类在几年前已被现代 java.time 类所取代。永远不要使用Date,永远不要使用Calendar。 Sun、Oracle 和 JCP 在采用 JSR 310 时放弃了这些类。您也应该这样做。
LocalDate
如果您想表示仅日期值、没有时间和时区,请使用LocalDate。
LocalDate localDate = LocalDate.of( 2021 , Month.FEBRUARY , 23 ) ;
要捕获当前日期,您必须指定时区。对于任何给定的时刻,日期在全球范围内因时区而异。在日本东京,日期可能是“明天”,而在美国俄亥俄州托莱多,日期可能是“昨天”。如果省略时区,则隐式应用 JVM 当前的默认时区。我建议始终保持明确。
ZoneId z = ZoneId.of( "America/Edmonton" ) ;
LocalDate today = LocalDate.now( z ) ;
通过在 Tomcat 上运行的 Servlet 代码中的该代码,您将获得当前日期。
示例小服务程序
这是一个完整的工作 Servlet。
package work.basil.example.DemoWebApp;
import java.io.*;
import java.time.LocalDate;
import java.time.ZoneId;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet ( name = "todayServlet", value = "/today" )
public class TodayServlet extends HttpServlet
{
public Instant whenServletInitialized ;
public void init ( )
{
this.whenServletInitialized = Instant.now() ;
}
public void doGet ( HttpServletRequest request , HttpServletResponse response ) throws IOException
{
response.setContentType( "text/html" );
PrintWriter out = response.getWriter();
out.println( "<html><body>" );
out.println( "<h1>" + "Today" + "</h1>" );
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ); // or ZoneId.systemDefault()
LocalDate today = LocalDate.now( zoneId );
out.println( "<p>Current date in time zone " + zoneId.toString() + " is " + today.toString() +".</p>");
out.println( "</body></html>" );
}
public void destroy ( )
{
}
}
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 & JPA 2.2 支持 java.time。
从哪里获取 java.time 类?