我有一个字符串,它以YYYYMMDD
-
public static void verifyInput(String input) {
}
此处传递的输入将采用此形式“YYYYMMDD”;
如何验证input
仅以此格式YYYYMMDD
传递的字符串?
我只需要验证它是否为YYYYMMDD
这种格式..我不需要以YYYYMMDD
格式获取当前日期,然后将其与ss
进行比较。
更新: -
我只需要验证字符串输入,看看它们是否采用这种格式YYYYMMDD
意思是,如果有人传递字符串hello
,那么它不是YYYYMMDD
格式..
如果有人传递此字符串20130130
,则会以此YYYYMMDD
格式验证此字段。
答案 0 :(得分:4)
您可以使用SimpleDateFormat和Date,这是一个解决方案 -
private static final java.text.SimpleDateFormat sdf =
new java.text.SimpleDateFormat("yyyyMMdd");
public static java.util.Date verifyInput(String input) {
if (input != null) {
try {
java.util.Date ret = sdf.parse(input.trim());
if (sdf.format(ret).equals(input.trim())) {
return ret;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
public static void main(String[] args) {
String[] dates = new String[] { "20141031",
"20130228", "20000229", "20000230" };
for (String str : dates) {
System.out.println(verifyInput(str));
}
}
输出
Fri Oct 31 00:00:00 EDT 2014
Thu Feb 28 00:00:00 EST 2013
Tue Feb 29 00:00:00 EST 2000
null
答案 1 :(得分:2)
try {
new SimpleDateFormat("yyyyDDmm").parse(input);
// good format
} catch (ParseException e) {
// bad format
}
答案 2 :(得分:1)
我建议您使用 java.time,现代 Java 日期和时间 API,用于您的日期工作。
private static final DateTimeFormatter DATE_PARSER
= new DateTimeFormatterBuilder().appendPattern("yyyyMMdd")
.parseDefaulting(ChronoField.ERA, IsoEra.CE.getValue())
.toFormatter(Locale.ROOT)
.withResolverStyle(ResolverStyle.STRICT);
/** @throws DateTimeParseException if the input date is invalid */
public static void verifyInput(String input) {
LocalDate.parse(input, DATE_PARSER);
}
尝试一下:
String[] sampleStrings = { "20211231", "00000714",
"20200229", "20210229", "9990731", "100000714" };
for (String sample : sampleStrings) {
try {
verifyInput(sample);
System.out.println("Valid: " + sample);
} catch (DateTimeParseException dtpe) {
System.out.println("Invalid: " + sample);
}
}
输出:
<块引用>Valid: 20211231
Invalid: 00000714
Valid: 20200229
Invalid: 20210229
Invalid: 9990731
Invalid: 100000714
我在格式模式中使用 yyyy
以确保年份严格为正数(至少为 0001)。例如,我使用 ResolverStyle.STRICT
来排除非闰年的 2 月 29 日。为了完成这项工作,我需要提供一个时代,否则每一年都会是模棱两可的,Java 将拒绝严格解决它。 CE 是共同的时代,《纪元多米尼》。
yyyyMMdd
(不是YYYYMMDD
)我将 YYYYMMDD 理解为 4 位数的年份、2 位数的月份和 2 位数的月份日期,这是大多数没有任何特殊编程知识的英语用户所理解的方式。在 Java 和其他编程语言中,格式模式字母区分大小写。其中一些是:
符号 | 含义和注释 |
---|---|
y | 时代;从 1 |
是 | 周-年;仅对周数有用 |
你 | 年;在公历和 ISO 8601 中使用的签名年份;允许 0(与 java.time 一起引入,不适用于旧的 SimpleDateFormat ) |
M | 月份 |
米 | 分时 |
d | 月份; 0 到 28–31 |
D | 一年中的哪一天; 0 到 365 或 366 |
答案 3 :(得分:0)
将其传递给SImpleDateFormat对象,格式字符串为yyyyMMdd。
答案 4 :(得分:0)
使用RegExp(Pattern&amp; Matcher):
public static void verifyInput(String input) {
Pattern p = Pattern.compile("^\d{4}(1[012]|0[1-9])(3[01]|[12]\d|0[0-9])$");
Matcher m = p.matcher(input);
return m.matches();
}
(虽然它会检查有效的月份和日期nubmers,但它不会检查当前月份是否只有28/30天。如果您需要检查它,可以添加。)
答案 5 :(得分:0)
你可以通过..验证它。
boolean validate(String s)
{
if(s.length()!=8)
return false;
try{
int year=Integer.parseInt(s.substring(0,4));
}
catch(Exception e)
{
return false;
}
try{
int month=Integer.parseInt(s.substring(4,6));
}
catch(Exception e)
{
return false;
}
try{
int date=Integer.parseInt(s.substring(6,8));
}
catch(Exception e)
{
return false;
}
if(month>12)
return false;
if(date>31)
return false;
return true;
}
答案 6 :(得分:0)
扩展Neuron的答案:
if (month < 1 || month > 12)
return false;
int days = 30;
if (month == 2) {
days = 28;
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) days = 29;
}
else {
if ((1 << month) & 0x15A2) days = 31;
}
if (date < 1 || date > days)
return false;
return true;
答案 7 :(得分:0)
你可以这样做:
private boolean validateDateFormat(String input) {
if(input == null) {
return false;
}
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
try {
Date d = format.parse(input);
logger.debug(d);
return true;
} catch(ParseException e) {
return false;
}
}
使用此方法对其进行单元测试:
@Test
public void TestDateValidation() {
logger.info("\ntestDateValidation()");
assertEquals(false, validateDateFormat("hello"));
assertEquals(false, validateDateFormat(null));
assertEquals(false, validateDateFormat(""));
assertEquals(false, validateDateFormat("d20140228"));
assertEquals(false, validateDateFormat("Feb 28, 2014"));
assertEquals(true, validateDateFormat("20140228"));
validateDateFormat("20140229");
validateDateFormat("2014024000");
}
给出了这个输出:
Fri Feb 28 00:00:00 EST 2014
Sat Mar 01 00:00:00 EST 2014
Mon Jan 13 00:00:00 EST 2025
不幸的是,这两个古怪的日期仍然被解析为好像它们是真实日期,但看起来根据您的要求不是问题。
答案 8 :(得分:0)
使用 Apache commons-validator
进行验证GenericValidator.isDate("20130130", "yyyyMMdd", true)
答案 9 :(得分:-1)
将字符串转换为日期:
SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDD");
Date date = sdf.parse(input);