Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不知道格式的情况下将字符串转换为日期?_Java_Date_Format - Fatal编程技术网

Java 如何在不知道格式的情况下将字符串转换为日期?

Java 如何在不知道格式的情况下将字符串转换为日期?,java,date,format,Java,Date,Format,我有个问题。我正在尝试将一些字符串转换为日期,但我不知道日期的格式 它可能是yyyy.mm.dd hh:mm:ss或mm.dd.yy hh:mm:ss等等 如何将这些字符串转换为日期? 我试过这个: DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); Date d = (Date)formatter.parse(someDate); 但是当我打印出某个日期时,它是这样打印的:2010-08-05 12:42:4

我有个问题。我正在尝试将一些字符串转换为日期,但我不知道日期的格式

它可能是
yyyy.mm.dd hh:mm:ss
mm.dd.yy hh:mm:ss
等等

如何将这些字符串转换为日期? 我试过这个:

DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
Date d = (Date)formatter.parse(someDate);
但是当我打印出某个日期时,它是这样打印的:2010-08-05 12:42:48.638 CEST,意思是
yyyy.mm.dd hh:mm:ss
,然而当我运行上述代码时,日期对象现在变成
Sat Jan 31 00:42:48 CET 11
,这至少说来很奇怪

你知道如何正确设置字符串的格式吗?

你不能


如果你有日期
2010-08-05
,那么它可以是2010年8月5日,也可以是2010年5月8日-你需要知道日期格式(或者至少优先考虑一种格式)来区分它们。

我唯一的猜测是,你应该先收集一些统计数据来确定格式


如果幸运的话,你会有类似“2010/08/13”这样的日期,可以毫不含糊地解析它

你的问题与国际化有关。正如Kragen所回答的,你不能只解析未知格式的日期。虽然您可以扫描所有可能的区域设置并解析某些内容,但您不知道是否正确解析了它

只是一点i18n背景:

问:你能告诉我这个日期指的是哪一天、哪一个月、哪一年吗

09/11/10


答:不知道地点,你就不能。它可能是任何东西。9月11日在美国。11月9日在英国。等等。

我同意克拉根的观点,即在一般情况下,没有正确的解决方案。但是,如果以下条件成立,您可以使用以下解决方案:

  • 您有一套所有可能的格式

  • 格式之间没有歧义;其中两个无法成功解析日期表达式

  • 考虑以下迭代可能格式列表的解决方案。此解决方案利用,以便在多线程环境中有效地进行日期解析(请记住,
    SimpleDateFormat
    不是线程安全的):

    公共类FlexibleDateParser{
    private List threadLocals=new ArrayList();
    公共FlexibleDateParser(列表格式、最终时区){
    threadLocals.clear();
    for(最终字符串格式:格式){
    ThreadLocal dateFormatTL=新的ThreadLocal(){
    受保护的SimpleDataFormat初始值(){
    SimpleDataFormat sdf=新的SimpleDataFormat(格式);
    设置时区(tz);
    sdf.setLenient(错误);
    返回sdf;
    }
    };
    添加(dateFormatTL);
    }       
    }
    公共日期parseDate(字符串dateStr)引发ParseException{
    for(ThreadLocal tl:threadLocals){
    SimpleDataFormat sdf=tl.get();
    试一试{
    返回sdf.parse(dateStr);
    }捕获(解析异常){
    //忽略并尝试下一个日期分析器
    }
    }
    //所有解析器都失败了
    返回null;
    }       
    }
    
    如前所述,您至少需要有一个有序的候选模式列表。一旦有了它,就有了一个
    parseDate(String-dateString,String[]patterns)
    方法,让您可以轻松地尝试日期字符串上的模式列表,并通过第一个匹配的模式对其进行解析:

    public static Date parseDate(String str,
                             String[] parsePatterns)
                      throws ParseException
    
    通过尝试各种不同的解析器来解析表示日期的字符串

    解析将依次尝试每个解析模式。只有在解析整个输入字符串时,才会认为解析成功。如果没有匹配的解析模式,将引发ParseException

    解析器将对解析的日期宽大处理


    如果是协议;定义格式-也许ISO会激怒所有人,除了我们瑞典人


    如果是用户的输入;让他们设置他们的区域设置。如果可以,请以完整格式显示解析的日期,以便用户可以进行验证,如2009年11月10日

    这是一个基于美国日期格式的快速而肮脏的解决方案

    public  String compareDate( PaymentTxnRequest request ) throws ParseException { 
            Date debitDate= request.getPaymentTxn().getCrValDt();
            Date now = new Date();
            String response="";
            SimpleDateFormat sdfDate = new SimpleDateFormat("dd/MM/yyyy");
            String strCurrDate = sdfDate.format(now);
            String strDebitDate = sdfDate.format(debitDate);
            System.out.println("Current Date: " + strCurrDate);
            Date currentDate =  new SimpleDateFormat("dd/MM/yyyy").parse(strCurrDate);
            Date txnDate =  new SimpleDateFormat("dd/MM/yyyy").parse(strDebitDate);
            System.out.println("C -> "+currentDate);
            System.out.println("C -> "+txnDate); 
             if (txnDate!=null){
             if (currentDate.equals(txnDate))
             {
                 System.out.println("Valid Txn");
                 response="valid";
             }
             if (currentDate.after(txnDate))
             {
                System.out.println("--> Not  Valid TXN Past");   
                response="notValid";
             }
            if (currentDateenter code here.before(txnDate)){
                System.out.println("Future Valid TXn");
                 response="future";
            }
         }
            return response;
        }
    
    public Date parseDate(String strDate) throws Exception
    {
        if (strDate != null && !strDate.isEmpty())
        {
            SimpleDateFormat[] formats =
                    new SimpleDateFormat[] {new SimpleDateFormat("MM-dd-yyyy"), new SimpleDateFormat("yyyyMMdd"),
                            new SimpleDateFormat("MM/dd/yyyy")};
    
            Date parsedDate = null;
    
            for (int i = 0; i < formats.length; i++)
            {
                try
                {
                    parsedDate = formats[i].parse(strDate);
                    return parsedDate;
                }
                catch (ParseException e)
                {
                    continue;
                }
            }
        }
        throw new Exception("Unknown date format: '" + strDate + "'");
    }
    
    public Date parseDate(字符串strDate)引发异常
    {
    if(strDate!=null&&!strDate.isEmpty())
    {
    SimpleDataFormat[]格式=
    新SimpleDataFormat[]{新SimpleDataFormat(“MM dd yyyy”)、新SimpleDataFormat(“yyyyMMdd”),
    新的简化格式(“MM/dd/yyyy”)};
    日期parsedDate=null;
    对于(int i=0;i
    这是一个简单的解决方案,对我来说很有用。 这是一个简单的方法来解析日期,将字符串作为参数传递,并以您想要的任何格式解析它

    String dateToConvert(String date) {
            String strDate = "";
            try {
                //create SimpleDateFormat object with source string date format
                DateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd");
    
                //parse the string into Date object
                Date d = sdfSource.parse(date);
                LocalLog.e(LOG_TAG, d.toString());
                //create SimpleDateFormat object with desired date format
                SimpleDateFormat sdfDestination = new SimpleDateFormat(AppConstants.UNIVERSAL_DATE_FORMAT);
    
                //parse the date into another format
                strDate = sdfDestination.format(d);
    
                LocalLog.e(LOG_TAG, strDate);
    
            } catch (ParseException pe) {
                System.out.println("Parse Exception : " + pe);
            }
            return strDate;
        }
    

    此答案是我对另一个问题的答案的副本,标记为此问题的副本 我曾经有一项任务,就是编写一段代码,解析一个日期格式未知的字符串。也就是说,我必须解析任何有效的日期格式。我写了一个项目,之后我写了一篇文章,描述了我的实现背后的想法。以下是文章的链接:。一般的想法是将您希望支持的所有模式写入到外部属性文件中,并从中读取它们,然后尝试按这些格式逐个解析您的字符串,直到成功或格式用尽为止。请注意,顺序也很重要,因为某些字符串可能对几种格式有效(美国/欧洲的差异)。优点是您可以在不更改代码的情况下不断向文件添加/删除格式。所以这样的项目可以
    String dateToConvert(String date) {
            String strDate = "";
            try {
                //create SimpleDateFormat object with source string date format
                DateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd");
    
                //parse the string into Date object
                Date d = sdfSource.parse(date);
                LocalLog.e(LOG_TAG, d.toString());
                //create SimpleDateFormat object with desired date format
                SimpleDateFormat sdfDestination = new SimpleDateFormat(AppConstants.UNIVERSAL_DATE_FORMAT);
    
                //parse the date into another format
                strDate = sdfDestination.format(d);
    
                LocalLog.e(LOG_TAG, strDate);
    
            } catch (ParseException pe) {
                System.out.println("Parse Exception : " + pe);
            }
            return strDate;
        }