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

解析前确定字符串是否为有效日期

别永年
2023-03-14
问题内容

在这种情况下,我正在读取大约13万条记录,其中包含存储为String字段的日期。一些记录包含空格(空),一些包含这样的字符串:“ dd-MMM-
yy”,而另一些包含此“ dd / MM / yyyy”。

我写了这样的方法:

public Date parsedate(String date){

   if(date !== null){
      try{
        1. create a SimpleDateFormat object using 'dd-MMM-yy' as the pattern
        2. parse the date
        3. return the parsed date
      }catch(ParseException e){
          try{
              1. create a SimpleDateFormat object using 'dd/MM/yyy' as the pattern
              2. parse the date
              3. return parsed date
           }catch(ParseException e){
              return null
           }
      }
   }else{
      return null
   }

}

因此,您可能已经发现了问题。 我正在使用try .. catch作为我逻辑的一部分
。最好事先确定String实际上包含某种格式的可解析日期,然后再尝试解析它。

那么,是否有一些API或库可以帮助您解决此问题?我不介意编写几种不同的Parse类来处理不同的格式,然后创建一个工厂来选择正确的6类,但是,如何确定哪一个呢?

谢谢。


问题答案:

有关如何使用类型消除try /
catch块的概述,请参见Java中的惰性错误处理Option

功能性Java是您的朋友。

本质上,您想要做的是将日期解析包装在一个不会抛出任何东西的函数中,而是在其返回类型中指示解析是否成功。例如:

import fj.F; import fj.F2;
import fj.data.Option;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import static fj.Function.curry;
import static fj.Option.some;
import static fj.Option.none;
...

F<String, F<String, Option<Date>>> parseDate =
  curry(new F2<String, String, Option<Date>>() {
    public Option<Date> f(String pattern, String s) {
      try {
        return some(new SimpleDateFormat(pattern).parse(s));
      }
      catch (ParseException e) {
        return none();
      }
    }
  });

好的,现在您有了一个可重用的日期解析器,它不会抛出任何东西,但是会通过返回type值来指示失败Option.None。使用方法如下:

import fj.data.List;
import static fj.data.Stream.stream;
import static fj.data.Option.isSome_;
....
public Option<Date> parseWithPatterns(String s, Stream<String> patterns) { 
  return stream(s).apply(patterns.map(parseDate)).find(isSome_()); 
}

这将为您提供与第一个匹配的模式(或类型为Option.None的值)解析的日期,该值是类型安全的,而null不是。

如果您想知道什么Stream是…,这是一个懒惰的清单。这样可以确保您在第一个成功的模式之后忽略模式。不需要做太多的工作。

像这样调用您的函数:

for (Date d: parseWithPatterns(someString, stream("dd/MM/yyyy", "dd-MM-yyyy")) {
  // Do something with the date here.
}

要么…

Option<Date> d = parseWithPatterns(someString,
                                   stream("dd/MM/yyyy", "dd-MM-yyyy"));
if (d.isNone()) {
  // Handle the case where neither pattern matches.
} 
else {
  // Do something with d.some()
}


 类似资料:
  • 问题内容: 我从API收到日期字符串,其格式为。 我目前正在使用正则表达式来验证字符串格式,这种方法可以正常工作,但是我可以看到某些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。即,例如。 PHP中是否有更好的方法来接收诸如这样的字符串,并确定该日期是否为该格式的有效日期? 问题答案: 您可以为此目的使用类: 测试用例:

  • 我从API接收一个日期字符串,它的格式为。 我目前正在使用正则表达式来验证字符串格式,它工作正常,但是我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。 在PHP中有没有更好的方法来获取字符串,例如,并判断它是否是格式的有效日期?

  • 问题内容: 有谁知道PHP的健壮(和防弹)is_JSON函数代码片段?我(显然)遇到一种情况,我需要知道字符串是否为JSON。 嗯,也许通过JSONLint请求/响应来运行它,但这似乎有点过头了。 问题答案: 如果您使用内置的PHP函数,则 返回最后一个错误(例如, 当您的字符串不是JSON时)。 无论如何通常都会返回。

  • 更新: 这是否意味着,如果我想检查一个特定的字符串是否是有效的日期时间,我需要一个巨大的格式数组??会有不同的组合,我相信。 即使有很多日期分隔符('.'、'/'、'-'等)根据区域性的不同,我很难定义要检查的格式数组。 基本上,我想检查一个特定的字符串是否至少包含日(1到31或01到31)、月(1到12或01到12)和年(yyyy或yy),以任何顺序,使用任何日期分隔符,解决方案是什么? 所以,

  • 问题内容: 我编写了两个简单的函数来确定字符串是否是回文。我以为它们是等效的,但是2不起作用。为什么是这样? 1个 2 问题答案: 不会创建字符串,而是创建“反向”对象: 因此,字符串不等于object 。为了使它起作用,您需要确保实际评估了该对象: 所述插入件在每个字符串中的字符,并且这导致反转串之间正在变成一个字符串对象。

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