gpt4 book ai didi

java - 判断字符串是否为有效日期的最快方法

转载 作者:IT老高 更新时间:2023-10-28 21:08:45 26 4
gpt4 key购买 nike

我在工作中支持一个通用库,它对给定字符串执行许多检查以查看它是否是有效日期。 Java API、commons-lang 库和 JodaTime 都有可以解析字符串并将其转换为日期的方法,让您知道它是否实际上是有效日期,但我希望有一种方法在不实际创建日期对象(或 JodaTime 库的情况下的 DateTime )的情况下进行验证。例如这里是一段简单的示例代码:

public boolean isValidDate(String dateString) {
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
try {
df.parse(dateString);
return true;
} catch (ParseException e) {
return false;
}
}

这对我来说似乎很浪费,我们正在丢弃生成的对象。根据我的基准测试,我们在这个公共(public)库中大约 5% 的时间用于验证日期。我希望我只是缺少一个明显的 API。任何建议都会很棒!

更新

假设我们可以始终使用相同的日期格式(可能是 yyyyMMdd)。我确实也考虑过使用正则表达式,但是它需要知道每个月的天数、闰年等......


结果

解析日期 1000 万次

Using Java's SimpleDateFormat: ~32 seconds 
Using commons-lang DateUtils.parseDate: ~32 seconds
Using JodaTime's DateTimeFormatter: ~3.5 seconds
Using the pure code/math solution by Slanec: ~0.8 seconds
Using precomputed results by Slanec and dfb (minus filling cache): ~0.2 seconds

有一些非常有创意的答案,我很感激!我想现在我只需要决定我需要多少灵 active ,我希望代码看起来像什么。我要说 dfb 的答案是正确的,因为它纯粹是我最初的问题中最快的。谢谢!

最佳答案

如果您真的关心性能并且您的日期格式真的那么简单,只需预先计算所有有效字符串并将它们散列到内存中。你上面的格式只有大约 800 万个有效组合,直到 2050 年


Slanec 编辑 - 引用实现

此实现取决于您的特定日期格式。它可以适应任何特定的日期格式(就像我的第一个答案一样,但要好一些)。

它是一组dates从 1900 年到 2050 年(存储为字符串 - 其中有 54787 个),然后将给定日期与存储的日期进行比较。

一旦dates set 已创建,它的速度非常快。快速的微基准测试显示,与我的第一个解决方案相比,改进了 10 倍。

private static Set<String> dates = new HashSet<String>();
static {
for (int year = 1900; year < 2050; year++) {
for (int month = 1; month <= 12; month++) {
for (int day = 1; day <= daysInMonth(year, month); day++) {
StringBuilder date = new StringBuilder();
date.append(String.format("%04d", year));
date.append(String.format("%02d", month));
date.append(String.format("%02d", day));
dates.add(date.toString());
}
}
}
}

public static boolean isValidDate2(String dateString) {
return dates.contains(dateString);
}

附:可以修改为使用Set<Integer>甚至TroveTIntHashSet这大大减少了内存使用量(因此允许使用更大的时间跨度),然后性能下降到略低于 my original solution 的水平。 .

关于java - 判断字符串是否为有效日期的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11480542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com