解析可以采用以下格式之一的日期的最佳方法是什么
"dd-MM-yyyy HH:mm"
"dd/MM/yyyy HH:mm"
"dd.MM.yyyy HH:mm"
无需创建 3 个 SimpleDateFormat 并针对每个进行解析。
谢谢
解析可以采用以下格式之一的日期的最佳方法是什么
"dd-MM-yyyy HH:mm"
"dd/MM/yyyy HH:mm"
"dd.MM.yyyy HH:mm"
无需创建 3 个 SimpleDateFormat 并针对每个进行解析。
谢谢
您能否先运行两个替换操作,以便将所有三种格式都简化为一种格式?
将源字符串“调整”为规范格式可能是最简单的:
if (text.length() == 16)
{
if ((text.charAt(2) == '/' && text.charAt(5) == '/') ||
(text.charAt(2) == '.' && text.charAt(5) == '.'))
{
text = text.substring(0, 2) + "-" + text.substring(3, 5)
+ "-" + text.substring(6);
}
}
然后使用“-”使用格式字符串。
请注意,这是非常具体的,只替换您感兴趣的字符,以避免不必要的副作用。
您可以使用Apache commons lang DateUtils.parseDate
import java.text.ParseException;
import org.apache.commons.lang.time.DateUtils;
public class Test {
public static void main(String[] args) throws ParseException {
String[] values = new String[]{"31-12-2009 12:00", "31/12/2009 12:00", "31.12.2009 12:00"};
String[] parsePatterns = new String[]{"dd-MM-yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd.MM.yyyy HH:mm"};
for (String value : values) {
System.out.println(DateUtils.parseDate(value, parsePatterns));
}
}
}
好吧,它在内部创建了 SimpleDateFormats,但这有什么问题呢?
您可以使用DateTimeFormatter
它允许您使用方括号指定可选内容。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.stream.Stream;
public class Main {
public static void main(String args[]) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("d[-][.][/]M[-][.][/]u H:m", Locale.ENGLISH);
// Test
Stream.of(
"28-04-2021 14:01",
"28.04.2021 14:01",
"28/04/2021 14:01"
).forEach(s -> System.out.println(LocalDateTime.parse(s, dtf)));
}
}
输出:
2021-04-28T14:01
2021-04-28T14:01
2021-04-28T14:01
从Trail: Date Time了解有关现代日期时间 API 的更多信息。
请注意,旧的日期时间 API(java.util
日期时间类型及其格式化 API SimpleDateFormat
)已过时且容易出错。建议完全停止使用它们并切换到java.time
现代日期时间 API *。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。
正则表达式怎么样:
"\\d\\d[./-]\\d\\d[./-]\\d\\d\\d\\d \\d\\d:\\d\\d"
在代码中,这意味着这样的事情:
Pattern pattern =
Pattern.compile("(\\d\\d)([./-])(\\d\\d)([./-])(\\d\\d\\d\\d) (\\d\\d):(\\d\\d)");
Matcher matcher =
pattern.matcher("31-07-1983 15:30");
if (matcher.find() && matcher.group(2).equals(matcher.group(4))) {
int day = Integer.parseInt(matcher.group(1));
int month = Integer.parseInt(matcher.group(3));
int year = Integer.parseInt(matcher.group(5));
int hour = Integer.parseInt(matcher.group(6));
int minute = Integer.parseInt(matcher.group(7));
}
用正则表达式自己做:
public class SpecialDateFormat
{
private final static Pattern PATTERN = Pattern.compile("(\\d{2})[\\.\\/\\-](\\d{2})[\\.\\/\\-](\\d{4}) (\\d{2}):(\\d{2})");
public static Date parse(String text) throws ParseException {
Matcher m = PATTERN.matcher(text);
if (m.matches()) {
int dd = Integer.parseInt(m.group(1));
int mm = Integer.parseInt(m.group(2));
int yy = Integer.parseInt(m.group(3));
int hh = Integer.parseInt(m.group(4));
int mi = Integer.parseInt(m.group(5));
// NOTE: Checking if values are in valid ranges omitted
Calendar cal = Calendar.getInstance();
cal.set(yy, mm - 1, dd, hh, mi, 0);
return cal.getTime();
}
else {
throw new ParseException("Unparseable date: " + text, 0);
}
}
}
但是请注意,这确实允许混合不同的分隔符,例如“17-09/2009 12:00”是允许的。
ParseExact 可以采用一系列格式。您仍然必须指定所有格式,但这是一个单一的操作。