【问题标题】:How to get delimiter from a date string?如何从日期字符串中获取分隔符?
【发布时间】:2018-04-12 14:25:35
【问题描述】:

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

【问题讨论】:

  • “格式可以不同”是什么意思
  • 你能提供更多的例子吗?
  • 我们需要更多不同格式的示例才能识别模式。
  • @JosephK。你读过其他的cmets吗?在您指定所有可能的格式或足以生成模式之前,我们将无法提供帮助。
  • 所以只需要用户指定分隔符吗?

标签: java date datetime-parsing


【解决方案1】:

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

  • 正如您所说,分隔符可以是-/.,所以我假设不允许使用其他分隔符。
  • 根据您在问题中的唯一示例,我们正在寻找日期的分隔符,而不是时间。
  • 在您的示例中,我们假设日期始终列在时间之前。

因此,我们应该能够通过查找这三个字符中的任何一个的第一次出现来解决这个问题:

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();
}

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

【讨论】:

  • 如果日期部分中出现完全意外的分隔符,它可能会从时间部分返回分隔符或小数点。我不认为我愿意冒险。
  • @OleV.V.好点子。我想我们可以在空格的第一个字符处停止,假设空格不是分隔符。
  • 谢谢,至少这是一个很好的答案,对此表示赞同。如果找不到更好的解决方案,我可以使用它。我知道我的问题很奇怪,提前感谢您的努力。
  • @JosephK。乐意效劳!因为格式是由用户创建的,所以我认为除了让他们手动输入分隔符和格式之外,任何答案都不够。
【解决方案2】:

基本上你有两个选择:

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

    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);
        }
    }
    
  2. 找到分隔符并用它构建模式:

    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);
        }
    }
    

使用:

String strdate1 = "04-03-2018 02:34:22";
LocalDateTime date1 = stringToDate(strdate1);

【讨论】:

  • “格式可以不同” - 我不相信charAt(2) 会一直有效。
  • @JacobG。当然,它会抛出异常
  • 抛出异常是不可接受的。仅仅因为您的代码无法处理输入并不意味着输入是错误的
【解决方案3】:

从格式字符串中,我将使用正则表达式来取出以yMd 开头和结尾的最长子字符串,并且在两者之间没有其他字母。如果有更多这样的子字符串,我会依次使用它们。这应该为您提供yyyy-MM-dd 或格式的相应部分。然后从这个子字符串(这些子字符串)中取出所有既不是字母也不是空格的字符(再次使用正则表达式)。或者也许还有空格。你有你的分隔符/s。考虑没有或不止一个的情况。

这可能比其他人说的要复杂一些,但我认为如果你真的不知道格式会是什么样子,它也会更安全一些。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2019-12-03
    • 2015-05-13
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多