如何检查字符串是否包含Java中的日期?

时间:2017-05-21 13:54:52

标签: java regex string date simpledateformat

如何检查字符串是否包含此表单的日期:

  

2012年1月15日星期日美国东部时间下午7:36

我正在使用的数据包含大量字符串。但我正在寻找的字符串类型包含2或3个字的名称和日期。我正在检查日期以识别这些类型的字符串。

我已经为这种类型的日期找到了simpleDateFormat。

String string1 = "Rahul Chowdhury Sunday, January 15, 2012 at 7:37pm EST";
String string2 = "Aritra Sinha Nirmal Friday, April 1, 2016 at 10:16pm EDT";    

SimpleDateFormat format = new SimpleDateFormat("EEEEE, MMM dd, yyyy 'at' hh:mmaa z");

但我不知道如何继续前进。

我猜测正则表达式可能会有效,但我不知道如何在月/日名称的长度变化时实现。即'May'比'December'短得多。

我想知道是否有使用正则表达式的解决方案或更简单的解决方案。

我知道还有其他主题提出类似的问题,但他们没有回答我的问题。

3 个答案:

答案 0 :(得分:5)

您可以先使用正则表达式检查日期是否存在:

\w+,\s+\w+\s+\d+\,\s+\d+\s+at\s+\d+:\d+(pm|am)\s+\w{3,4}

此正则表达式与

匹配
Rahul Chowdhury Sunday, January 15, 2012 at 7:37pm EST
Aritra Sinha Nirmal Friday, April 1, 2016 at 10:16pm EDT

https://regex101.com/r/V0dAf8/2/

当您在文字中找到匹配项时,您可以使用SimpleDateFormat检查其是否格式正确。

String input = "Rahul Chowdhury Sunday, January 15, 2012 at 7:37pm EST";
String regex = "(\\w+,\\s+\\w+\\s+\\d+\\,\\s+\\d+\\s+at\\s+\\d+:\\d+(pm|am)\\s+\\w{3,4})";
Matcher matcher = Pattern.compile(regex).matcher(input);
if (matcher.find()) {
  System.out.println(matcher.group(1));
}

这将打印:

Sunday, January 15, 2012 at 7:37pm EST

答案 1 :(得分:2)

如果你不想使用public class ParseDate { public static void main(String[] args) { String date = "Rahul Chowdhury Sunday, January 15, 2012 at 7:36pm EST"; //Pattern: "Fullname EEEEE, MMM dd, yyyy 'at' hh:mmaa z" String dateComponents[] = date.split(","); String fullName = dateComponents[0].substring(0, dateComponents[0].lastIndexOf(" ")); String dayText = dateComponents[0].substring(dateComponents[0].lastIndexOf(" ")); String month = dateComponents[1].trim().split(" ")[0]; String dayNumber = dateComponents[1].trim().split(" ")[1]; String year = dateComponents[2].split("at")[0]; String time = dateComponents[2].split("at")[1].trim().split(" ")[0]; String zone =dateComponents[2].split("at")[1].trim().split(" ")[1]; // if you want to go further String hour = time.split(":")[0]; String minutes = time.split(":")[1].substring(0,2); String aa = time.split(":")[1].substring(2,4); System.out.println(fullName + " " + dayText + " " + month + " " + dayNumber + " " + year + " " + time + " " + zone); System.out.println(hour + " " + minutes + " " + aa); } } ,你可能会做这样的事情(我知道这是一种痛苦,但只是一种不同的方法)。

Rahul Chowdhury Sunday January 15  2012  7:36pm EST
7 36 pm

<强>输出

static object traceSync = new object( );
static int traceMessageNumber;
internal static void Emit( this TraceSource traceSource, TraceEventType eventType, string message, params object[ ] args )
{
  try
  {
    lock ( traceSync )
    {
      var msgNum = Interlocked.Increment( ref traceMessageNumber );

      if ( traceSource.Switch.ShouldTrace( eventType ) )
      {
        //--> format your message like you want...
        var msg = YourMessageFormatter( msgNum, message, args );

        foreach ( TraceListener listener in traceSource.Listeners )
        {
          try
          {
            listener.WriteLine( msg );
            listener.Flush( );
          }
          catch { }
        }
      }
    }
  }
  catch
  {
    //--> maybe we'll write an event log entry?
  }
}

答案 2 :(得分:1)

您可以使用simpleDateFormat解析方法对其进行测试。要继续使用代码,请使用try / catch包围代码,例如:

try {
    Date date = format.parse(string);
} catch (ParseException e) {
        //the string is not applicable to the date format
}

如果日期是遵循SimpleDateFormat中格式指南的字符串,则将成功创建日期。