在java的simpledateformat中强制使用4位数年份

我想使用格式为“yyyymmdd”的simpleDateFormat来validation和解析日期。这也允许100624,它被解析为10年(Julius Ceasar去世后54年)。 日期也将像1970年一样,所以我不想与SimpleDateFornat(“yymmdd”)达成和解。

我想知道有没有办法使用SimpleDateFormat强制四位数的年份格式? 我接近做了一个regexp测试,但也许有一种聪明的方法来使用(简单)DateFormat()?

根据要求的代码,事情变得越来越复杂,我的研究只有一半。 使用的格式是yyyy-MM-dd开头(它来自一个变量,它有一个错误的javadoc)。 但是如下面的答案中所示,yyyyMMdd确实强制使用了四年的数字。 所以我的问题改为如何强制“yyyy-MM-dd”格式的四位数年份。 为什么“yyyyMMdd”表现不同?

public void testMaturity() { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); sdf.setLenient(false); System.out.println(" " + sdf.format(sdf.parse("40-12-14"))); SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd"); sdf.setLenient(false); System.out.println(" " + sdf2.format(sdf2.parse("401214"))); fail(); } catch (ParseException pe) { assertTrue(true); } 

其中打印0040-12-14

只需使用yyyyMMdd (注意:大写字母M用于表示月份,否则您正在解析分钟 !)然后检查年份是否更大一些截止日期(例如,解析出生日期时,更大的1800是安全的赌注,当解析日期大于或等于当前年份的日期将是好的)。

嗯。 我怀疑你应该使用“MM”而不是“mm”来开始……但是当我尝试时,“100624”无法解析 – 即使在宽松模式下:

 import java.util.*; import java.text.*; public class Test { public static void main(String[] args) throws Exception { SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); format.setLenient(true); tryParse(format, "100624"); format.setLenient(false); tryParse(format, "100624"); } static void tryParse(DateFormat format, String text) { try { Date date = format.parse(text); System.out.println("Parsed " + text + " to " + date); } catch (ParseException pe) { System.out.println("Failed to parse " + text); } } } 

(甚至使用“mm”而不是“MM”它仍然无法解析。)

打印:

 Failed to parse 100624 Failed to parse 100624 

也许你可以展示管理解析这个的代码?

尝试调用setLenient(false);SimpleDateFormat对象上 – 这将使它使用更严格的规则进行解析(否则如果输入字符串与格式不完全匹配,它将尝试“智能”)。 例如:

 DateFormat df = new SimpleDateFormat("yyyyMMdd"); df.setLenient(false); 

当然,几个月是MM ,而不是mm

这没有简单的方法。 如果你说日期可以像1970年一样,主要的问题是700624意味着什么 – 1970年或2070年? 您应该实施像Joachim建议的截止日期或完全移动到4位数年份。

嗯,这是非常直接和前进。 请遵循以下简单步骤:

步骤1:

 try { String dates = "40-12-14"; String patterns = "yy-MM-dd"; SimpleDateFormat format3 = new SimpleDateFormat(patterns);`` java.util.Date dates1 = format3.parse(dates); SimpleDateFormat sdfDates = new SimpleDateFormat("dd/MM/yyyy"); String strDate1 = sdfDate.format(dates1); System.out.println("Date1: " + strDate1); } catch(ParseException e){ e.printStackTrace(); } 

这将输出:

 Date1: 14/12/1940