将DateFormats列表与字符串格式的传入日期进行比较

时间:2016-05-04 15:09:41

标签: java simpledateformat date-formatting

我想在java中使用SimpleDateFormat将日期转换为94 NOV 21到94/11/21。

我创建了一个简单的日期格式

 new SimpleDateFormat("yy MMM dd") 

解析94 NOV 21。但它无法解析什么是正确的模式?

在我的代码中我有许多标准格式的日期,我通过将它们全部添加到一个列表(DateFormats)并将传入日期与此列表进行比较来处理非标准日期(R 250051Z FEB 99) )在异常块内工作正常但我的主要问题是我无法使用新的SimpleDateFormat(“yy MMM dd”)解析94 NOV 21。最后的System.out语句转到异常块但是应该用new处理SimpleDateFormat(“yy MMM dd”)但这不起作用。

  import java.util.List;
  import java.util.Locale;
  import java.io.UnsupportedEncodingException;

 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;

import java.nio.charset.StandardCharsets;

import org.apache.commons.lang.StringUtils;

     public class Test2 {

   public static void main(String[] args) {
    // TODO Auto-generated method stub

    System.out.println(getDate("August 21 99"));

    System.out.println(getDate("21 August 1999"));

    System.out.println(getDate("94 NOV 21"));

     }

   private static String getDate(String inputString) {

    if (!StringUtils.isEmpty(inputString)) {
        String input = inputString.replaceAll("[^A-Za-z0-9 ]", " ");
        // System.out.println("input to formatter>>" + input);
        String requiredDate = "";
        SimpleDateFormat requiredDateFormat = new        

      SimpleDateFormat("MM/dd/yy");

        List<SimpleDateFormat> dateFormats = new    

    ArrayList<SimpleDateFormat>() {
            {

                add(new SimpleDateFormat("MMM dd yyyy", Locale.US));
                add(new SimpleDateFormat("MMM dd yy", Locale.US));
                add(new SimpleDateFormat("yy MMM yy", Locale.US));
                add(new SimpleDateFormat("dd MMM yyyy", Locale.US));
                add(new SimpleDateFormat("M dd yyyy", Locale.US));
                add(new SimpleDateFormat("dd M yyyy", Locale.US));
                add(new SimpleDateFormat("dd MM yy", Locale.US));
                add(new SimpleDateFormat("MM dd yy", Locale.US));
                add(new SimpleDateFormat("M dd yyyy hh mm ss a", 

    Locale.US));
                add(new SimpleDateFormat("dd M yyyy hh mm ss a", 
     Locale.US));

            }
        };

        Date date = null;

        for (SimpleDateFormat format : dateFormats) {
            // System.out.println("in for loop");
            try {
                format.setLenient(false);
                date = format.parse(input.trim());
                if (date != null) {
                    requiredDate =          
    requiredDateFormat.format(date).toString();
                    break;
                }
            } catch (ParseException e) {

                String day = inputString.subSequence(2, 4).toString();
                String monYear = inputString.substring(10);
                String dateToConvert = day + " " + monYear;
                SimpleDateFormat customDateFormatter = new SimpleDateFormat("dd MMM yy");
                try {
                    date = customDateFormatter.parse(dateToConvert);
                    if (date != null) {
                        requiredDate = requiredDateFormat.format(date).toString();
                        break;
                    }

                } catch (Exception ex) {

                    requiredDate = null;

                }
                // System.out.println("Handle separately");

            }

        }

        System.out.println("requiredDate>>>" + requiredDate);
        return requiredDate;

    }

    else {
        return null;
    }
   }

  }

3 个答案:

答案 0 :(得分:1)

您的格式在Ideone上运行正常。

我怀疑您使用的是非英语默认语言环境。尝试强制在美国语言环境中解析日期:

System.out.println(  // Works.
    new SimpleDateFormat("yy MMM dd", Locale.US).parse("94 NOV 21"));

System.out.println(  // Does not work - expects NOV. (with a period).
    new SimpleDateFormat("yy MMM dd", Locale.FRANCE).parse("94 NOV 21"));

答案 1 :(得分:0)

更新:

在看到你更新的代码之后,我需要建议你不要前进,你使用 bruteforce 将一个给定的字符串解析成一个日期对象,在某些情况下可以工作但在其他情况下只会破坏你的数据并打破漏洞申请......

想象一下如果发生这种情况会发生什么。

04 12 05正在尝试解析?

是2005年12月4日? 2004年5月12日,2005年4月12日? 好的答案是,是俄罗斯轮盘赌,因为你正在使用多个格式化程序迭代数组列表...

总结:

您需要知道日期格式。周期。

答案 2 :(得分:0)

Agent

在上述代码中,yy表示年份,即年份的最后两位数,MMM表示缩写的月份,即3个字母的月份,d表示月份的日期。

来源:https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html enter image description here