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

时间:2015-05-06 09:25:15

标签: java date datetime simpledateformat

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

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:582014-Mar-14-12:58(这样我现在将获得5到6种格式)。我想用if if来检查格式然后根据格式为每种格式编写单独的代码。但如果将来出现新的日期格式,它将会失败。

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

请建议我使用通用方式(通用功能)。

3 个答案:

答案 0 :(得分:2)

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

解决方案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 :(得分:2)

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

你能做的最好,正如另一个答案(need flexible datetime conversion with joda)所建议的那样,是这样的:

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;
}

要使用此代码,您只需使用日期字符串调用parseDate即可。 要添加新格式,请将其添加到FORMATTERS数组。

这不是你最终可以得到的最漂亮的代码。通过异常和断开循环处理代码可能是一种不好的做法。请参阅link1link2

为了增强您的代码,您可以考虑使用Joda-Time(Java&lt; = 7)或Java 8 java.time类:DateTimeFormat / DateTimeFormatter和{{3} } / LocalDateTime(joda)提供LocalDateTime(java8)超过标准/旧标准:

使用Java 8 java.time类:

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

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

如果无法解析dateInString而不是enhanced API null,我还添加了一些Optional来处理结果的空白。

答案 2 :(得分:1)

你给了

obj.evaluate("2014-06-14 12:58");

所以,字符串应该像SimpleDateFormat()

硬编码字符串应该与{{1}}

中提到的格式完全相同