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