此处lenient
用于Java DateFormat
。我检查了文档,但没有得到它的说法。
任何人都可以告诉我这个lenient
有什么用处,我们使用它的一个实时例子?
答案 0 :(得分:45)
javadoc明确指出:
指定日期/时间解析是否宽松。同 宽松解析,解析器可以使用启发式来解释输入 与该对象的格式不完全匹配。通过严格的解析, 输入必须与此对象的格式匹配。
因此,如果您有一个模式并创建一个严格匹配您的模式的日期对象,请将lenient设置为false
。此外,默认情况下,DateFormat
是宽松的。
基本上,DateFormat
设置Calendar.setLenient
和Javadoc状态:
指定日期/时间解释是否宽松。 通过宽松的解释,日期如“1996年2月942”将 被视为相当于2月1日后的第941天, 1996.通过严格(非宽大)的解释,这样的日期将导致 要抛出的异常。默认值为lenient。
答案 1 :(得分:23)
例如:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
System.out.println(simpleDateFormat.parse("0"));
simpleDateFormat.setLenient(false);
System.out.println(simpleDateFormat.parse("0"));
结果:
Thu Jan 01 00:00:00 CET 1
Exception in thread "main" java.text.ParseException: Unparseable date: "0"
at java.text.DateFormat.parse(Unknown Source)
at net.java.quickcheck.generator.support.X.main(X.java:28)
答案 2 :(得分:18)
我的建议是永远关闭宽容。我想不出你想要宽松的情况,这个设置永远不应该是像SimpleDateFormat这样的类的默认设置。宽松处理可以将垃圾解释为有效的时间字符串,并打开可能难以在测试中捕获的错误。此外,如果您使用宽松来容忍时间格式的变化,您将被烧毁。例如:
System.out.println(new SimpleDateFormat("yyyyMMdd").parse("2010-12-30"));
收益率(您的时区可能会有所不同):
Mon Nov 02 00:00:00 EST 2009
这个荒谬的结果似乎是2010年的第二天(“ - 2”)减去一个月(“ - 1”)。第0个月是12月!
不幸的是,使用setLenient(false)并不会导致对模式的严格解释。 SimpleDateFormat将在模式匹配后容忍垃圾,如下所述:
SimpleDateFormat.parse() ignores the number of characters in pattern
此外,对模式字符的数量并不严格,例如“d”而不是“dd”:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/d");
sdf.setLenient(false);
System.out.println("For 5: " + sdf.parse("2010/01/5"));
System.out.println("For 05: " + sdf.parse("2010/01/05"));
System.out.println("For 15: " + sdf.parse("2010/01/15"));
收率:
For 5: Tue Jan 05 00:00:00 EST 2010
For 05: Tue Jan 05 00:00:00 EST 2010
For 15: Fri Jan 15 00:00:00 EST 2010
同样使用setLenient(false)“2010/01/5”接受模式“yyyy / MM / dd”。并且忽略了数据分歧,例如“1999/2011”,模式为“yyyy / yyyy”(答案是2011年)。
使用SimpleDateFormat验证日期/时间字符串遗憾地是不可靠的。如果你按照上面的链接,你会看到一些解决方案,包括我写的更严格的SimpleDateFormat版本!
答案 3 :(得分:10)
如果日期不宽松,如果超出范围日期,则会抛出错误,但如果不是,那么它将接受并修复它。例如August 61st
以上评论将于9月30日结束。
Java doc关于如何设置它。默认为真。
答案 4 :(得分:8)
默认情况下,DateFormat对象是宽松的。
Leniency(Javadoc - 日历)
Calendar有两种解释日历字段的方式,lenient 而且不宽容。当日历处于宽松模式时,它接受a 比它产生的更广泛的日历字段值。当一个日历 重新计算get()返回的日历字段值,全部 日历字段已标准化。例如,宽大 GregorianCalendar将MONTH == JANUARY,DAY_OF_MONTH == 32解释为 2月1日。
当Calendar处于非宽松模式时,如果是,则抛出异常 其日历字段中存在任何不一致之处。例如,a GregorianCalendar总是生成介于1和之间的DAY_OF_MONTH值 这个月的长短。一个非宽松的GregorianCalendar抛出一个 计算其时间或日历字段值时的例外情况(如果有) 已设置超出范围的字段值。
答案 5 :(得分:5)
宽恕是指是否适用严格的规则 解析。如果DateFormat对象是宽松的,它将接受Jan 32, 事实上,它可以自由地将其转换为2006年2月1日。默认情况下,DateFormat对象是宽松的。
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
public class MainClass {
public static void main(String[] args) {
DateFormat shortDf = DateFormat.getDateInstance(DateFormat.SHORT);
DateFormat mediumDf = DateFormat.getDateInstance(DateFormat.MEDIUM);
DateFormat longDf = DateFormat.getDateInstance(DateFormat.LONG);
DateFormat fullDf = DateFormat.getDateInstance(DateFormat.FULL);
System.out.println(shortDf.format(new Date()));
System.out.println(mediumDf.format(new Date()));
System.out.println(longDf.format(new Date()));
System.out.println(fullDf.format(new Date()));
// parsing
try {
Date date = shortDf.parse("Jan 32, 2005");
} catch (ParseException e) {
}
}
}
结果:
1/26/07
Jan 26, 2007
January 26, 2007
Friday, January 26, 2007
答案 6 :(得分:4)
如果您希望日期解析器严格接受您提供的日期格式,则可以将其设置为不宽松。在the doc:
中对此进行了详细解释默认情况下,解析是宽松的:如果输入不是此对象的格式方法使用的形式,但仍可以解析为日期,则解析成功。客户可以通过致电
setLenient(false)
坚持严格遵守格式。