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_Datetime_Simpledateformat - Fatal编程技术网

Java 是否将给定日期转换为通用日期格式?

Java 是否将给定日期转换为通用日期格式?,java,date,datetime,simpledateformat,Java,Date,Datetime,Simpledateformat,我必须获取一个输入日期并将其转换为通用日期格式。 为此,我创建了一个函数(不是泛型函数),下面是该函数的示例代码 public class ConvertTimestampFormat{ public void evaluate(String dateInString) { if (!StringUtils.isEmpty(dateInString)) { SimpleDateFormat formatter = new SimpleDateFo

我必须获取一个输入日期并将其转换为通用日期格式。 为此,我创建了一个函数(不是泛型函数),下面是该函数的示例代码

public class ConvertTimestampFormat{
    public void evaluate(String dateInString) {
        if (!StringUtils.isEmpty(dateInString)) {

            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm");
            try {
                Date date = formatter.parse(dateInString);
                System.out.println(date);
                System.out.println(formatter.format(date));
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
     }
    public static void main(String[] args) {
        ConvertTimestampFormat obj = new ConvertTimestampFormat();
        obj.evaluate("2014-06-14-12:58");
    }
}
如果示例代码中有错误,请更正

这里我硬编码了输入日期格式
2014-06-14-12:58
。在这里,我将获得不同类型的日期格式,如
2014/06/14-12:58
2014-Mar-14-12:58
(这样我现在将获得5到6种格式)。我考虑使用if-else检查格式,然后根据格式为每种格式编写单独的代码。但如果将来出现新的日期格式,它将失败

我的输出格式应始终为
yyyy-MM-dd hh:MM:ss

请建议我使用通用方法(通用函数)来执行此操作。

您给出了

SimpleDateFormat formatter = `new SimpleDateFormat("yyyy-MM-dd hh:mm")`;
因此,字符串应该类似于
obj.evaluate(“2014-06-14 12:58”)

硬编码字符串的格式应与您给出的

SimpleDateFormat formatter = `new SimpleDateFormat("yyyy-MM-dd hh:mm")`;
因此,字符串应该类似于
obj.evaluate(“2014-06-14 12:58”)


硬编码字符串的模式应与
simpleDataFormat()中所述的模式完全相同。
有两种方法可以做到这一点。您要么提供带有日期的格式化程序字符串,要么硬编码并链接(非常难看)您想要使用的每种格式。我建议将链式解决方案分解为多种方法

解决方案1:

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

import org.apache.commons.lang3.StringUtils;

public class ConvertTimestampFormat {

    private SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
    private Date dateObject;

    public void evaluate(String dateString, String dateFormat) {
        if (!StringUtils.isEmpty(dateString)) {

            SimpleDateFormat inputFormat = new SimpleDateFormat(dateFormat);
            try {
                dateObject = inputFormat.parse(dateString);
            } catch (ParseException e) {
                //Parse failed. String does not match the formatter.
            }

            if(dateObject != null) {
                System.out.println(outputFormat.format(dateObject));
            }
        }
    }   

    public static void main(String[] args) {
        ConvertTimestampFormat obj = new ConvertTimestampFormat();
        obj.evaluate("2014-03-14-12:58", "yyyy-MM-dd-hh:mm");
        obj.evaluate("2014-Mar-14-12:58", "yyyy-MMM-dd-hh:mm");
    }
}
丑陋的解决方案:

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

import org.apache.commons.lang3.StringUtils;

public class ConvertTimestampFormat {

    private SimpleDateFormat inputFormat1 = new SimpleDateFormat("yyyy-MM-dd-hh:mm");
    private SimpleDateFormat inputFormat2 = new SimpleDateFormat("yyyy-MMM-dd-hh:mm");
    private SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
    private Date dateObject;

    public void evaluate(String dateInString) {
        if (!StringUtils.isEmpty(dateInString)) {

            try {
                dateObject = inputFormat1.parse(dateInString);
            } catch (ParseException e) {
                try {
                    dateObject = inputFormat2.parse(dateInString);
                } catch (ParseException e1) {
                    //String didn't match either formatters. You'll want to do something about this!
                }
            }

            if(dateObject != null) {
                System.out.println(outputFormat.format(dateObject));
            }
        }
    }   

    public static void main(String[] args) {
        ConvertTimestampFormat obj = new ConvertTimestampFormat();
        obj.evaluate("2014-03-14-12:58");
        obj.evaluate("2014-Mar-14-12:58");
    }
}

有两种方法可以做到这一点。您要么提供带有日期的格式化程序字符串,要么硬编码并链接(非常难看)您想要使用的每种格式。我建议将链式解决方案分解为多种方法

解决方案1:

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

import org.apache.commons.lang3.StringUtils;

public class ConvertTimestampFormat {

    private SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
    private Date dateObject;

    public void evaluate(String dateString, String dateFormat) {
        if (!StringUtils.isEmpty(dateString)) {

            SimpleDateFormat inputFormat = new SimpleDateFormat(dateFormat);
            try {
                dateObject = inputFormat.parse(dateString);
            } catch (ParseException e) {
                //Parse failed. String does not match the formatter.
            }

            if(dateObject != null) {
                System.out.println(outputFormat.format(dateObject));
            }
        }
    }   

    public static void main(String[] args) {
        ConvertTimestampFormat obj = new ConvertTimestampFormat();
        obj.evaluate("2014-03-14-12:58", "yyyy-MM-dd-hh:mm");
        obj.evaluate("2014-Mar-14-12:58", "yyyy-MMM-dd-hh:mm");
    }
}
丑陋的解决方案:

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

import org.apache.commons.lang3.StringUtils;

public class ConvertTimestampFormat {

    private SimpleDateFormat inputFormat1 = new SimpleDateFormat("yyyy-MM-dd-hh:mm");
    private SimpleDateFormat inputFormat2 = new SimpleDateFormat("yyyy-MMM-dd-hh:mm");
    private SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
    private Date dateObject;

    public void evaluate(String dateInString) {
        if (!StringUtils.isEmpty(dateInString)) {

            try {
                dateObject = inputFormat1.parse(dateInString);
            } catch (ParseException e) {
                try {
                    dateObject = inputFormat2.parse(dateInString);
                } catch (ParseException e1) {
                    //String didn't match either formatters. You'll want to do something about this!
                }
            }

            if(dateObject != null) {
                System.out.println(outputFormat.format(dateObject));
            }
        }
    }   

    public static void main(String[] args) {
        ConvertTimestampFormat obj = new ConvertTimestampFormat();
        obj.evaluate("2014-03-14-12:58");
        obj.evaluate("2014-Mar-14-12:58");
    }
}

目前,似乎没有任何“神奇”的方法来处理Java中所有可能的日期格式

正如另一个答案()中所建议的,您所能做的最好的事情如下:

private static final SimpleDateFormat[] FORMATTERS = new SimpleDateFormat[] {
    new SimpleDateFormat("yyyy-MM-dd hh:mm"),
    new SimpleDateFormat("yyyy/MM/dd-hh:mm"),
    [...]};

private static Date parseDate(String dateInString) {
    Date date = null;
    for (int i = 0; i < FORMATTERS.length; i++) {
        try {
            date = FORMATTERS[i].parse(dateInString);
            break;
        } catch (ParseException e) {
            // Nothing to do, try the next one
        }
    }
    return date;
}

如果不能解析
dateInString
而不是
null
,我还添加了一些函数来处理结果的空值。目前,似乎没有任何“神奇”的方法来处理Java中所有可能的日期格式

正如另一个答案()中所建议的,您所能做的最好的事情如下:

private static final SimpleDateFormat[] FORMATTERS = new SimpleDateFormat[] {
    new SimpleDateFormat("yyyy-MM-dd hh:mm"),
    new SimpleDateFormat("yyyy/MM/dd-hh:mm"),
    [...]};

private static Date parseDate(String dateInString) {
    Date date = null;
    for (int i = 0; i < FORMATTERS.length; i++) {
        try {
            date = FORMATTERS[i].parse(dateInString);
            break;
        } catch (ParseException e) {
            // Nothing to do, try the next one
        }
    }
    return date;
}

我还添加了一些来处理结果的空值,如果不能解析
dateInString
,而不是
null
,这就是。

注意泛型,它在java世界中的意思是这样的
List
,我想你的意思是灵活多于一般,不是吗?如果你有两种输入日期格式,那么每种类型都需要两个日期格式化程序。然后用第一个进行解析,捕捉异常,然后用第二个进行解析,如果在这里捕捉到异常,则输入与两个格式化程序都不匹配。@superbob我同意你的观点,它比泛型更为常见。@Daniel Tung同意两个格式化程序都不匹配。输入与两种格式不同。这里再次我需要添加格式,然后只有我会得到确切的结果。此外,我需要继续添加所有允许新格式的代码。是否有一种方法可以编写一个通用代码来接受所有可能的格式。请参阅我的答案,Java 8变体,您可以在
格式化程序
阵列中添加所有建议的,因为Java 8。请小心使用通用代码,它在Java世界中的含义如下
列表
,我想你的意思是灵活多于一般,不是吗?如果你有两种输入日期格式,那么每种类型都需要两个日期格式化程序。然后用第一个进行解析,捕捉异常,然后用第二个进行解析,如果在这里捕捉到异常,则输入与两个格式化程序都不匹配。@superbob我同意你的观点,它比泛型更为常见。@Daniel Tung同意两个格式化程序都不匹配。输入与两种格式不同。这里再次我需要添加格式,然后只有我会得到确切的结果。此外,我需要继续添加所有允许新格式的代码。有没有一种方法可以编写一个通用代码来接受所有可能的格式,您可以在
格式化程序中添加自Java 8以来所有建议的array@Blip是的,这是我在问题中提到的错别字,这是示例代码。@Blip是的,这是我在问题中提到的错别字,这是示例代码。谢谢你的回答,我心里有这个解决方案,只是在寻找更好的解决方案,如果有。谢谢你的回答在我看来,这个解决方案只是在寻找更好的解决方案,如果有的话。