2015-05-06 40 views
1

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

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来检查格式,然后根据格式为每种格式编写单独的代码。但是如果将来有新的日期格式,它将会失败。

我的输出格式总是应该是yyyy-MM-dd hh:mm:ss

请建议我通用的方式(通用功能)来做到这一点。

+0

要小心_generic_,它的Java世界它意味着这样的事情'List ',我认为你的意思_flexible_超过一般不是吗? – superbob

+1

如果您有两种输入日期格式,则每种类型都需要两个日期格式化器。然后你解析第一个,捕获异常,然后解析第二个,如果在这里捕获到异常,那么输入不匹配两个格式化器。 –

+0

@superbob我同意你的看法,它不仅仅是通用的。 – Ram

回答

1

你给

SimpleDateFormat formatter = `new SimpleDateFormat("yyyy-MM-dd hh:mm")`; 

因此,该字符串应该是这样obj.evaluate("2014-06-14 12:58");

硬编码字符串应该是准确的图案,里面SimpleDateFormat()

+0

我认为这是一个排字错误 – Blip

+0

@Blip是的,这是我在问题中提到的错字,它是示例代码。 – Ram

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"); 
    } 
} 
+0

感谢您的回复我有这个解决方案在我心中只是寻找更好的解决方案,如果有的话。 – Ram

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的< = 7)或Java 8 java.time类:DateTimeFormat/DateTimeFormatterLocalDateTime(joda)/LocalDateTime(java8),超过标准/旧的提供enhanced API

使用Java 8的Java。时间类:

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

我还添加了一些Optional处理结果的emptyness如果dateInString不能被解析,而不是null这是bad