如何检查字符串是否包含此表单的日期:
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'短得多。
我想知道是否有使用正则表达式的解决方案或更简单的解决方案。
我知道还有其他主题提出类似的问题,但他们没有回答我的问题。
答案 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中格式指南的字符串,则将成功创建日期。