在注册人员之前,我需要验证出生日期是否不大于以前的日期,例如(1970年1月1日(和当前日期。
对我不起作用的方法:
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
的日期。
tl;dr
使用现代类,特别是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
仅使用现代java.time类,不要使用SimpleDateFormat
或Calendar
。
LocalDate
LocalDate
类表示一个仅限日期的值,不包含一天中的时间,也不包含时区或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.time框架构建在Java8及更高版本中。这些类取代了诸如java.util.Date
、Calendar
和&CCD_ 18。
现在处于维护模式的JodaTime项目建议迁移到java.Time类。
要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*
类。
从哪里获得java.time类?
- Java SE 8、Java SE 9和Java SE 10,爪哇SE 11及更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些小功能和修复程序
- Java SE 6和Java SE 7
- 大多数Java.time功能都是向后移植到Java 6&7英寸ThreeTen背包
- Android
- java.time类的Android捆绑包的后续版本
- 对于早期的Android(<26(,ThreeTenABP项目适用于ThreeTen Backport(如上所述(。请参阅如何使用ThreeTenABP…
ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等等。