java - 如何验证正确的日期格式模式?格式化模式,而不是字符串中的日期

标签 java

我在项目中使用 Spring,属性文件如下所示。

reportPRM.field=\
TrxDateTime   |6    |yyMMdd;\
TrxDateTime   |6    |HHmmss;\
MerchantID    |16   |Space;\

我有一个具有多行的属性。用户可以更改 TrxDateTime 的日期格式模式。我需要验证模式的正确性。怎么做?

我已经尝试过下面的代码。

public static boolean validatePattern(String template) {
    try {
        new SimpleDateFormat(template);

        return true;
    } catch (IllegalArgumentException e) {
        logger.error(ThrowableHelper.getMessage(e));
    }

    return false;
}

但事实证明,输入“0”时给出 true。

编辑。添加了单元测试。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
@TestPropertySource(properties = "scheduler.enable=false")
public class DateFormatTest {

    @Test
    public void testDateFormat() {
        assertTrue(StringHelper.validatePattern("0"));
        assertTrue(StringHelper.validatePattern("abcde"));

        assertTrue(StringHelper.validatePattern("yyyyMMdd"));
        assertTrue(StringHelper.validatePattern("HHmmss"));
    }

}

对于输入“0”、“yyyyMMdd”、“HHmmss”返回true,对于“abcde”返回false。但我认为这还不够。日期格式模式必须符合通用标准模式。

编辑2。这是完整的属性。

reportPRM.field=\
TrxDateTime                                     |6  |yyMMdd;\
TrxDateTime                                     |6  |HHmmss;\
MerchantID                                      |16 |Space;\
CompanyName                                     |25 |Space;\
                                                |2  |ID;\
CardNo                                          |19 |0;\
                                                |4  |CPAY;\
Amount                                          |15 |0;\
{P: RespDesc, R: RespDescReversal}              |6  |0;\
{P: DSPRetCodePayment, R: DSPRetCodeReversal}   |3  |0;

我需要遍历每一行并检查第 3 列中的值是否为日期格式的模式。但上面的函数为“0”给出了 true

最佳答案

SimpleDateFormat API说:

Date and time formats are specified by date and time pattern strings. Within date and time pattern strings, unquoted letters from 'A' to 'Z' and from 'a' to 'z' are interpreted as pattern letters representing the components of a date or time string. Text can be quoted using single quotes (') to avoid interpretation. "''" represents a single quote. All other characters are not interpreted; they're simply copied into the output string during formatting or matched against the input string during parsing.

The following pattern letters are defined (all other characters from 'A' to 'Z' and from 'a' to 'z' are reserved):

(我粗体)

因此,如果您只想在输入字符串中允许日期和时间模式字母,则构建一个包含您想要允许的字母的正则表达式(作为上面给出的定义模式表的 [A-Za-z] 的子集)链接)并将输入字符串与正则表达式进行匹配,正如 kosmo 已经指出的那样。

要允许两种定义的格式,您需要正则表达式 yyMMdd|HHmmss 进行精确匹配,或者需要 [msdyHM]+ 如果您允许所有这些字母的任意组合。

示例:

public class Main {
    public static void main(String args[]) {
        String[] patterns = { "[msdyHM]+", "yyMMdd|HHmmss" };
        String[] input = { "yyMMdd", "HHmmss", "yyyyMMdd", "0", "mm", "abcd" };
        for (String pattern : patterns) {
            for (String str : input) {
                System.out.println(pattern + " match " + str + " " + str.matches(pattern) );
            }
        }
    }
}

输出:

[msdyHM]+ match yyMMdd true
[msdyHM]+ match HHmmss true
[msdyHM]+ match yyyyMMdd true
[msdyHM]+ match 0 false
[msdyHM]+ match mm true
[msdyHM]+ match abcd false
yyMMdd|HHmmss match yyMMdd true
yyMMdd|HHmmss match HHmmss true
yyMMdd|HHmmss match yyyyMMdd false
yyMMdd|HHmmss match 0 false
yyMMdd|HHmmss match mm false
yyMMdd|HHmmss match abcd false

关于java - 如何验证正确的日期格式模式?格式化模式,而不是字符串中的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54918156/

相关文章:

java - Android - 无法使用 Android Studio Bumblebee 生成 Javadoc

java - 配置Spring定时任务在用户认证后启动

java - Spring Security 在新应用程序启动时重定向到无效 session url

java - Hibernate - 复合主键包含外键

java - JMeter 的 web socket sampler 可以添加 header 信息吗?

java - Cassandra 中副本之间的计数器值不一致

java - 开发网络摄像头聊天应用程序

java - Spring 的@Scheduled 注解是如何工作的?

java - 使用反射获取java注释

java - 解析门户 URL