[英]How to compare the current date with the previous date from database in JSP or in Java?
[英]How do you compare date, previous date and future date in Java?
在注册一个人之前,我需要确认出生日期不大于先前的日期,例如(01/01/1970)和当前日期。
对我不起作用的方法:
public void agregarPersona() throws Exception {
ImplPersonaD dao;
try {
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
String fechaActual = String.valueOf(dateFormat.format(date));
String fechaPasada = "01/01/1970";
if(fechaPasada > persona.getFechNac() <= fechaActual ){
dao = new ImplPersonaD();
dao.agregarPersona(persona);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Satisfactorio", "Ingresado correctamente"));
}
else{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Invalido", "Fecha invalida"));
}
} catch (Exception e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Hubo un problema"));
}
}
以下几行无效,并且不执行您认为应做的事情:
String fechaActual= String.valueOf(Calendar.DATE/Calendar.MONTH/Calendar.YEAR);
String fechaPasada = "01/01/1970";
if(fechaPasada > persona.getFechNac() <= fechaActual ){
看来您想检查persona.getFechNac()
返回的值是1970年1月1日之后和当前日期之前或等于当前日期的日期。
正确的方法是这样的:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
// ...
LocalDate fechaActual = LocalDate.now();
LocalDate fechaPasada = LocalDate.of(1970, 1, 1);
LocalDate fechNac = LocalDate.parse(persona.getFechNac(),
DateTimeFormatter.ofPattern("dd/MM/yyyy"));
if (fechNac.isAfter(fechaPasada) && fechaActual.isBefore(fechNac)) {
// ...
}
我在这里假设persona.getFechNac()
返回一个String
其中包含格式为dd/MM/yyyy
。
使用现代类,尤其是LocalDate
。
LocalDate // Represent a date-only value without a time-of-day and without a time zone or offset-from-UTC.
.parse(
"21/01/1966" , // String in some localized format.
DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) // Specify formatting pattern to match input string.
) // Returns a `LocalDate` object.
.isBefore( // Compare one `LocalDate` to another.
LocalDate.EPOCH // 1970-01-01
) // Returns a boolean.
真正
仅使用现代java.time类,切勿使用SimpleDateFormat
或Calendar
。
LocalDate
LocalDate
类表示仅包含日期的值,没有日期, 时间段或offset-from-UTC 。
定义格式模式以匹配您的输入字符串。
String input = "01/01/1970" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate limit = LocalDate.parse( input , f ) ;
获取今天的日期。
时区对于确定日期至关重要。 在任何给定时刻,日期都会在全球范围内变化。 例如, 法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。
如果未指定时区,则JVM隐式应用其当前的默认时区。 该默认值可能会在运行时(!)期间随时更改 ,因此您的结果可能会有所不同。 最好将[期望/预期时区] [2]明确指定为参数。
以continent/region
的格式指定正确的时区名称 ,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用2-4字母的缩写,例如EST
或IST
因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
如果要使用JVM的当前默认时区,请提出要求并作为参数传递。 如果省略,则隐式应用JVM的当前默认值。 最好明确一点,因为缺省值可以在运行时随时由JVM中任何应用程序的任何线程中的任何代码更改。
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
boolean isBeforeLimit = today.isBefore( limit ) ; // Returns false.
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。
您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序 。 不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.