【问题标题】:Date Parsing using SimpleDateFormat and parsePosition使用 SimpleDateFormat 和 parsePosition 进行日期解析
【发布时间】:2015-05-15 12:04:16
【问题描述】:

我正在尝试将字符串解析为日期对象。之前我使用了 parse(String) 定义,但是像 4/1/2004 2:00:00asasasas 这样的日期被正确解析,这是错误的。所以我使用了 ParsePosition 签名parse(String,parsePosition) 并检查索引是否不等于长度,那么它是一个无效的日期。但上述逻辑对于字符串为“2004 年 4 月 1 日凌晨 2:00:00 的字符串失败。虽然它是一个有效的日期,但由于索引和长度逻辑,当我尝试以“M / dd / YYYY”格式解析它时,它说无效日期。解析器解析正确的日期部分并且不考虑整个字符串。任何方式来实现它?formatStr可以是任何格式模式。

请指教。

public static void main(String[] args) {
        String formatStr="M/dd/YYYY";
    SimpleDateFormat sd = new SimpleDateFormat(formatStr, Locale.getDefault());
        String str = "4/1/2004 2:00:00 AM";

        ParsePosition pp1 = new ParsePosition(0);

        Date retDate = sd.parse(str, pp1);
        if(retDate==null ||pp1.getIndex()!=str.length() ){
            System.out.println("I have a invalid Date");

        }

    }

【问题讨论】:

  • " 当我尝试以 "M/dd/YYYY" 格式解析它时,它说日期无效" - 当然是这样,因为该格式不包括时间,而你的字符串值做。你想要yyyy 而不是YYYY 请注意...
  • 你的格式应该是M/d/y h:m:s a
  • 感谢您的回复。当前 API 实现接受字符串文本和日期格式模式(可以是 M/d/y h:m:s a 或 M/dd/YYYY)。这取决于用户他想要什么日期格式。当前 API 使用 M/dd/YYYY 模式完美解析字符串 4/1/2004 2:00:00 AM。所以我正在寻找一种向后兼容的方法,这意味着它通过 4/1/2004 2:00: 00 AM 但在 2004 年 4 月 1 日 2:00:00 abcd 使用“M/dd/YYYY”模式失败。我知道它有点蹩脚,但任何方向都会有帮助

标签: java date simpledateformat


【解决方案1】:

用途:

public static void main(String[] args) {
        String formatStr="MM/dd/yyyy hh:mm:ss aa";
    SimpleDateFormat sd = new SimpleDateFormat(formatStr, Locale.getDefault());
        String str = "04/01/2004 02:00:00 AM";

        ParsePosition pp1 = new ParsePosition(0);

        Date retDate = sd.parse(str, pp1);
        if(retDate==null ||pp1.getIndex()!=str.length() ){
            System.out.println("I have a invalid Date");

        }

    }

更正 formatStr 以在 am/pm 中包含小时,在减号中包含年份。月和日也使用两位数。

如果您想使用 abcd 而不是 AM / PM 进行解析,您可以使用正则表达式拆分。

public static void main(String[] args) {
    String formatStr="M/dd/yyyy h:m:s";

    SimpleDateFormat sd = new SimpleDateFormat(formatStr, Locale.getDefault());
        String str = "04/01/2004 2:00:00 abcd";

        String[] strDate = str.split(" .[a-zA-Z]");

        ParsePosition pp1 = new ParsePosition(0);

        Date retDate = sd.parse(strDate[0], pp1);
        if(retDate==null ||pp1.getIndex()!=strDate[0].length() ){
            System.out.println("I have a invalid Date");

        }
        else
        {
           System.out.println("I have a valid Date");

        }

    }

见: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

【讨论】:

  • 谢谢 我知道正确的日期格式是 MM/dd/yyyy hh:mm:ss aa 但是我当前的实现使用 M/ 成功解析 04/01/2004 02:00:00 AM dd/YYYY 模式。尝试字符串格式Str="M/dd/YYYY";字符串 str = "2004 年 4 月 1 日凌晨 2:00:00"; SimpleDateFormat sd = new SimpleDateFormat(formatStr, Locale.getDefault());日期 retDate = sd.parse(str)
  • 所以,你想要这个工作:String str = "4/1/2004 2:00:00 abcd" ?
【解决方案2】:

解决问题的两种方法。

仅解析 String 中的日期并使用您的格式

public static void main(String[] args) throws Exception {
    String formatStr = "MM/dd/yyyy";
    SimpleDateFormat sd = new SimpleDateFormat(formatStr, Locale.getDefault());
    String str = "4/1/2004 2:00:00 AM";

    ParsePosition pp1 = new ParsePosition(0);

    String justDate = str.substring(0, str.indexOf(" "));
    Date retDate = sd.parse(justDate, pp1);
    if (retDate == null || pp1.getIndex() != justDate.length()) {
        System.out.println("I have a invalid Date");
    } else {
        System.out.println("I have a valid Date");
    }
}

或者为您正在测试的String 使用正确的格式

public static void main(String[] args) throws Exception {
    String formatStr = "MM/dd/yyyy hh:mm:ss aa";
    SimpleDateFormat sd = new SimpleDateFormat(formatStr, Locale.getDefault());
    String str = "4/1/2004 2:00:00 AM";

    ParsePosition pp1 = new ParsePosition(0);

    Date retDate = sd.parse(str, pp1);
    if (retDate == null || pp1.getIndex() != str.length()) {
        System.out.println("I have a invalid Date");
    } else {
        System.out.println("I have a valid Date");
    }
}

结果:

我有一个有效的日期

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多