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

莫高尔大师:

在这种情况下,我正在读取大约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()
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java的8 LOCALDATE的不会解析有效日期字符串

检查Python字符串是否为有效的Excel单元格

如何验证字符串是否为有效的Java变量?

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

正确确定日期字符串是否为该格式的有效日期

如何在JS中验证字符串是否为有效日期

检查Unicode字符串是否为NFC在Python中的有效方法?

确定字符串在C中是否为有效的wchar_t *

确定值是否为字符串的最有效方法

检查给定的字符串是否为转换DateTime的有效格式字符串

字符串转换为有效日期

如何在Kotlin中将输入字符串验证为有效日期?

将字符串有效负载解析为Json的Javascript

检查给定字符串是否为C回文的有效方法

验证给定字符串是否为有效FQDN名称的最简单方法?

使用数字格式检查给定的字符串是否为有效货币

如何检查表示时间戳记的字符串在Java中是否为有效日期?

检查任何给定的字符串是否是有效日期

检查字符串在XSLT中是否为有效日期

是否存在确定字符串是否为有效连接字符串的可接受方法?

检查对象是否为字符串的最有效方法

有效 IP 字符串中的“:”是否足以确定它是 IPv6 地址?

检查字符串是否为有效日期

检查字符串是否为有效数字(根本没有字母)

如何确定字符串是否是有效的 PCI 地址?

使用时刻检查字符串是否为有效日期

从字符串的有效日期时间转换

确定格式为“hh:mm”的字符串是否为有效日期

递归解析json中所有有效的日期时间字符串