当前位置: 首页 > 面试题库 >

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

上官恩
2023-03-14
问题内容

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

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

这对我来说似乎很浪费,我们正在丢弃产生的对象。根据我的基准,大约有5%的时间用于验证日期。我希望我只是缺少一个明显的API。任何建议都很好!

更新

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

结果

解析日期一千万次

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

有一些非常有创意的答案,我很感激!我想现在我只需要决定我想要代码看起来像什么的灵活性即可。我要说的是dfb的答案是正确的,因为它纯粹是最快的,这是我最初提出的问题。谢谢!


问题答案:

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

Slanec编辑 -参考实现

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

它对dates1900年到2050年之间的所有数据进行了设置(存储为字符串-其中有54787个),然后将给定的日期与存储的日期进行比较。

一旦dates设置被创建,它的快速的地狱。快速的微基准测试显示比我的第一个解决方案提高了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);
}

PS它可被修改以使用Set<Integer>甚至特罗韦的TIntHashSet这减少存储器使用了很多(并因此允许使用更大的时间跨度),性能则下降到刚好低于电平我的原始溶液。



 类似资料:
  • 本文向大家介绍python判断给定的字符串是否是有效日期的方法,包括了python判断给定的字符串是否是有效日期的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python判断给定的字符串是否是有效日期的方法。分享给大家供大家参考。具体分析如下: 这里python判断给定的字符串是否是一个有效的日期,如果是一个日期格式的字符串,该函数返回True,否则返回False 希望本文所述对大

  • 本文向大家介绍纯javascript判断查询日期是否为有效日期,包括了纯javascript判断查询日期是否为有效日期的使用技巧和注意事项,需要的朋友参考一下 以下内容主要通过js代码给大家介绍,代码比较简单,包含注释,有好的建议欢迎提出。 如下图,当查询条件含有日期时,如“2012-3-4”,查询前校验输入的日期字符串是否为有效的日期 js判断年月日是否一个有效日期 以上代码就是对日期的有效性校

  • 检查给定的参数是否是一个字符串。 使用 typeof 来检查一个值是否为一个字符串。 const isString = val => typeof val === 'string'; isString('10'); // true

  • Python3 实例 以下实例通过创建自定义函数 is_number() 方法来判断字符串是否为数字: 实例(Python 3.0+)# -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com def is_number(s): try: float(s) return True except ValueErr

  • 本文向大家介绍C#判断日期是否到期的方法,包括了C#判断日期是否到期的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#判断日期是否到期的方法,在C#程序开发中非常具有实用价值。分享给大家供大家参考之用。具体方法如下: 一般在用户权限系统中,有时候需要根据用户的签约时间和签约时长来判断是否到期。先来看看帮助类如下: 客户端调用代码如下: 运行结果显示:还没到期~~ 希望本文所述对大家

  • 本文向大家介绍Java判断字符串为空、字符串是否为数字,包括了Java判断字符串为空、字符串是否为数字的使用技巧和注意事项,需要的朋友参考一下 关于 String 的判空: 注:“==”比较两个变量本身的值,即两个对象在内存中的首地址。而“equals()”比较字符串中所包含的内容是否相同。第二种写法中,一旦 selection 真的为 null,则在执行 equals 方法的时候会直接报空指针异