如何在Java中从字符串中提取日期并将其放入日期变量中

7
我一直在Stack Overflow和其他网站上寻找解决我的问题的方法,但没有找到适合我特定目的的解决方案,并且无法更改这些解决方案以适应我的代码。其中包括正则表达式代码,我不完全理解或不知道如何操作。
因此,这是我的问题:我有一个字符串,其结构为:
"name+" at:"+Date+" Notes:"+meetingnotes"
(name、Date和meetingnotes是变量)。我想做的是提取字符串的日期部分并将其粘贴到一个日期变量中。日期的基本格式为“yyyy-MM-dd”。我该怎么做?
5个回答

8
为此,正则表达式是您的好帮手:
String input = "John Doe at:2016-01-16 Notes:This is a test";

String regex = " at:(\\d{4}-\\d{2}-\\d{2}) Notes:";
Matcher m = Pattern.compile(regex).matcher(input);
if (m.find()) {
    Date date = new SimpleDateFormat("yyyy-MM-dd").parse(m.group(1));
    // Use date here
} else {
    // Bad input
}

或在Java 8+中:

    LocalDate date = LocalDate.parse(m.group(1));

4
一个日期模式识别算法,不仅能够识别日期模式,还可以获取Java日期格式中的可能日期。这个算法非常快速和轻量级。处理时间是线性的,并且所有日期都在单次扫描中被识别出来。该算法使用树遍历机制解析日期。树数据结构是定制创建的,以构建支持的日期、时间和月份模式。
算法还可以识别日期字面值之间的多个空格字符。例如 DD DD DD 和 DD DD DD 被视为有效日期。
以下日期模式被认为是有效的并可使用此算法进行识别。
dd MM(MM) yy(yy) yy(yy) MM(MM) dd MM(MM) dd yy(yy)
其中 M 代表月份文字,以字母格式表示,例如 Jan 或 January。
允许在日期之间使用的分隔符有 '/', '\', ' ', ',', '|', '-', ' '。
它还可以识别以下格式的尾随时间模式 hh(24):mm:ss.SSS 上午/下午 hh(24):mm:ss 上午/下午 hh(24):mm:ss 上午/下午
分辨率时间是线性的,不使用模式匹配或蛮力方法。该算法基于树遍历,返回以下三个组件的日期列表:文本中识别的日期字符串 - 转换和格式化的日期字符串 - SimpleDateFormat
使用日期字符串和格式字符串,用户可以根据自己的需求将字符串转换为对象。
该算法库可在 Maven 中心获取。
<dependency>
    <groupId>net.rationalminds</groupId>
    <artifactId>DateParser</artifactId>
    <version>0.3.0</version>
</dependency>

使用此功能的示例代码如下。
 import java.util.List;  
 import net.rationalminds.LocalDateModel;  
 import net.rationalminds.Parser;  
 public class Test {  
   public static void main(String[] args) throws Exception {  
        Parser parser=new Parser();  
        List<LocalDateModel> dates=parser.parse("Identified date :'2015-January-10 18:00:01.704', converted");  
        System.out.println(dates);  
   }  
 }

输出结果:[LocalDateModel{originalText=2015-january-10 18:00:01.704, dateTimeString=2015-1-10 18:00:01.704, conDateFormat=yyyy-MM-dd HH:mm:ss.SSS, start=18, end=46}]

详细博客请参考http://coffeefromme.blogspot.com/2015/10/how-to-extract-date-object-from-given.html

完整代码可在GitHub上找到:https://github.com/vbhavsingh/DateParser


日期格式如MMddYYYY、ddMMyyyy等,即没有空格的格式不受您的API支持。此外,如果我们除了日期之间的空格以外还有任何空格,则返回的结果为空白,例如“test01/06/2020”。如果可能,请包括这些格式并修复空格问题... - Vivek

1
您可以像这样使用解析器:

String fromDate = "2009/05/19";
DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
java.util.Date dtt = df.parse(fromDate);

这段代码可以将任何(格式良好的)字符串转换为日期变量。
该代码来自此处

0
以下是已实现的程序,用于搜索字符串并将其解析为日期对象。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringInBetween {
    public static void main(String[] args) throws ParseException {
        //"name+" at:"+Date+" Notes:"+meetingnotes" (name, Date and meetingnotes being variables).
        String test = "rama"+ " at:"+"2015-01-02"+" Notes:"+"meetingnotes";

        Pattern pattern = Pattern.compile("at:(.*)Notes");
        Matcher matcher = pattern.matcher(test);

        if(matcher.find())
        {
            String dateString = matcher.group(1);   //I'm using the Capturing groups to capture only the value.
            java.util.Date date = new SimpleDateFormat("yyyy-mm-dd").parse(dateString);
            System.out.println(date);
        }
    }
}

0

正则表达式过于复杂

对于初学者而言,使用正则表达式可能有点过于复杂。

一个简单但是低技术的方法是搜索你所需文本所包含的两个已知部分:at:Notes:

假设你确信这两个文本片段不会在其他文本中出现,你可以分别搜索它们并了解它们在整个字符串中的位置。使用String::indexOf来获得这些位置。然后使用String::substring`来提取表示日期值的文本。

String input = "John Doe at:2016-01-16 Notes:This is a test";

String at = "at:";  // We expect these two pieces of text to be embedded.
String notes = " Notes:";

// Verify that our expected pieces of text are indeed embedded.
if ( ! ( input.contains ( at ) && input.contains ( notes ) ) ) {
    // …handle error…
    System.out.println ( "ERROR - unexpected input" );
    return;
}

int indexAt = input.indexOf ( at );
int indexNotes = input.indexOf ( notes );
String extracted = input.substring ( indexAt + at.length ( ), indexNotes );

LocalDate

将提取的文本解析以获取LocalDate对象。已经多次介绍了将字符串解析为日期时间的方法,请搜索StackOverflow以了解更多信息。

您指定的格式yyyy-MM-dd符合标准ISO 8601格式。当解析/生成字符串时,java.time类默认使用这些标准格式。

    LocalDate localDate = LocalDate.parse ( extracted );

    System.out.println ( "extracted: " + extracted );
    System.out.println ( "localDate.toString(): " + localDate );

提取的日期:2016年1月16日 ld.toString():2016年1月16日

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接