Java 如何从日期字符串中获取分隔符?

Java 如何从日期字符串中获取分隔符?,java,date,datetime-parsing,Java,Date,Datetime Parsing,24.03.2018 02:34:22如何从此类日期字符串中获取分隔符()。?格式可以不同,分隔符也可以是'、'-'、'/'。Java的日期格式类有没有办法做到这一点?基本上,您有两种选择: 找到分隔符,然后选择如何使用此信息进行分析: private static LocalDateTime stringToDate(String str) { char delimiter = str.charAt(2); switch (delimiter) { case '

24.03.2018 02:34:22
如何从此类日期字符串中获取分隔符(
)。
?格式可以不同,分隔符也可以是
'、'-'、'/'
。Java的日期格式类有没有办法做到这一点?

基本上,您有两种选择:

  • 找到分隔符,然后选择如何使用此信息进行分析:

    private static LocalDateTime stringToDate(String str) {
        char delimiter = str.charAt(2);
        switch (delimiter) {
            case '.':
                return LocalDateTime.parse(str, DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
            case '/':
                return LocalDateTime.parse(str, DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));
            case '-':
                return LocalDateTime.parse(str, DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss"));
            default:
                throw new DateTimeParseException("Bad String", str, 0);
        }
    }
    
  • 找到分隔符并使用它构建模式:

    private static LocalDateTime stringToDate(String str) {
        String delimiter = str.substring(2, 3);
        if (delimiter.matches("[-\\.\\/]")) {
            return LocalDateTime.parse(str, DateTimeFormatter
                       .ofPattern("dd" + delimiter + "MM" + delimiter + "yyyy HH:mm:ss"));
        } else {
            throw new DateTimeParseException("Bad String " + str, str, 0);
        }
    }
    

  • 使用:


    为了回答这个问题,我们必须做出一些假设:

    • 正如您所说,分隔符可以是
      -
      /
      ,因此我假设不允许使用其他分隔符
    • 根据您问题中的唯一示例,我们正在查找日期的分隔符,而不是时间的分隔符
    • 从您的示例中,我们将假定日期总是在时间之前列出
    因此,我们应该能够通过查找这三个字符中的任何一个的首次出现来解决此问题:

    public static Optional<Character> findDelimiter(String formattedDate) {
        for (char c : formattedDate.toCharArray()) {
            switch (c) {
                case '.':
                case '/':
                case '-':
                    return Optional.of(c);
                case ' ':
                case '\t':
                    return Optional.empty();
            }
        }
    
        return Optional.empty();
    }
    
    public静态可选findDelimiter(字符串格式化日期){
    for(字符c:formattedDate.toCharArray()){
    开关(c){
    案例“”:
    案例“/”:
    案例'-':
    返回(c)的可选值;
    案例“”:
    案例'\t':
    返回可选的.empty();
    }
    }
    返回可选的.empty();
    }
    

    这将在空格或制表符的第一个实例处停止,假设它们都不是分隔符。

    从格式字符串中,我将使用正则表达式取出以
    y
    M
    d
    开头和结尾的最长子字符串,中间没有其他字母。如果有更多这样的子字符串,我会依次使用它们。这将为您提供格式的
    yyyy-MM-dd
    或相应部分。然后从这个子字符串(这些子字符串)中取出所有既不是字母也不是空格的字符(再次使用regexp)。或者也可能是空白。这是您的分隔符。当没有或多于一个的情况下考虑。 它可能比其他人说的要复杂一点,但我认为如果你真的不知道格式会是什么样子,那么它也会更安全一点


    可能有一种特殊情况:通常的格式化程序(
    DateTimeFormatter
    SimpleDateFormat
    )允许标点符号用撇号括起来。例如,
    yyyy.'MM.'dd
    的意思与
    yyyy.MM.dd
    相同。也许你想考虑一下。如果你真的想用撇号作为分隔符,它应该加倍:
    yyyy'MM'dd

    你说的“格式可以不同”是什么意思?你能提供更多的例子吗?我们需要更多不同格式的例子来识别模式。@JosephK。你看过其他评论了吗?除非您指定所有可能的格式或足够的格式来生成模式,否则我们将无法提供帮助。因此,让用户指定分隔符即可。“格式可以不同”-我不相信
    charAt(2)
    会一直起作用。@JacobG。当然,它会抛出异常Row异常是不可接受的。仅仅因为您的代码无法处理输入,并不意味着sinput是坏的。在日期部分出现完全意外的分隔符的情况下,它可能会从时间部分返回一个分隔符或小数点。“我想我不想冒这个险。说得好。我想我们可以停在空白的第一个字符处,假设空白不是分隔符。谢谢,至少这是一个好答案,我投了赞成票。如果找不到更好的解决方案,我可以用它。“我知道我的问题很奇怪,谢谢你事先的努力。”约瑟夫。很乐意帮忙!因为格式是由用户创建的,所以我认为除了让他们手动输入分隔符和格式之外,任何答案都不够。
    public static Optional<Character> findDelimiter(String formattedDate) {
        for (char c : formattedDate.toCharArray()) {
            switch (c) {
                case '.':
                case '/':
                case '-':
                    return Optional.of(c);
                case ' ':
                case '\t':
                    return Optional.empty();
            }
        }
    
        return Optional.empty();
    }