JAVA - 以独特的格式解析两个不同的日期字符串

JAVA - Parse two different Date strings in a unique format

我以两种不同的方式从 Oracle 数据库中提取 DATE 信息:通过查询和通过存储过程。 我通过

读取值
String day = rs.getString("DAY");

获得:

by query: 2017-01-01 00:00:00:0
by stored procedure: 01-JAN-17

我需要将它们转换成一种独特的格式,即

yyyy-MM-dd

我事先不知道值将如何提取(查询或存储),所以我事先不知道格式是什么。

是否有通用的方法来转换为目标格式? 我正在寻找一种将两个不同的输入字符串转换为通用输出格式的方法

换句话说,我需要一个 "black box" 代码,在输入未知字符串时将其转换为 yyyy-MM-dd.

谢谢

您可以测试返回字符串的长度,然后使用 SimpleDateFormat class 将日期转换为您的模式。

来自我的一个项目的示例:

DataM1 dataM1 = new DataM1();

        System.out.println("===>Ticket n°"+(k+1));

        SimpleDateFormat sdf = new SimpleDateFormat(fr.alteca.outilindicateurs.statics.Date.FORMAT_DATE_REDMINE);
        SimpleDateFormat sdf2 = new SimpleDateFormat(fr.alteca.outilindicateurs.statics.Date.FORMAT_DATE_OUTIL);

        String strDateCorrectionPrevue = (String) datesCorrectionPrevue.get(k);
        String strDateResolution = (String) datesResolution.get(k);

        System.out.println("===> date de correction prévue "+strDateCorrectionPrevue);
        System.out.println("===> date de resolution "+strDateResolution);


        Date dateCorrectionPrevue = sdf.parse(strDateCorrectionPrevue);
        Date dateResolution = sdf.parse(strDateResolution);

        long a = dateResolution.getTime();
        long b = dateCorrectionPrevue.getTime();

        double c = b-a;


        Param.nf.setMaximumFractionDigits(2);
        Param.nf.setMinimumFractionDigits(2);
        Param.nf.setRoundingMode(RoundingMode.HALF_UP);
        String fn = Param.nf.format(c/Param.MILLISECONDS_PER_DAY);

        double d = Param.nf.parse(fn).doubleValue();


        dataM1.setId(k);
        if (d>=-1) {
            dataM1.setDelaisTenu(true);
        }
        dataM1.setPerformance(d);
        dataM1.setDateCorrectionPrevue(sdf2.format(dateCorrectionPrevue));
        dataM1.setDateResolution(sdf2.format(dateResolution));
        listeDataM1.add(dataM1);

您可以将一个函数与 try/catch 一起使用:

public static String convertDate(String date)
   {

      SimpleDateFormat dateFormatQuery = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
      SimpleDateFormat dateFormatStored = new SimpleDateFormat("dd-MMM-yy");
      SimpleDateFormat dateFormatRet = new SimpleDateFormat("yyyy-MM-dd");
      Date ret = null;

      try
      {
         ret = dateFormatQuery.parse(date);
      }
      catch (ParseException e)
      {
         try
         {
            ret = dateFormatStored.parse(date);
         }
         catch (ParseException e1)
         {
            e.printStackTrace();
         }
      }

      return dateFormatRet.format(ret);
   }

您可能希望将 SimpleDateFormat 与以下格式一起使用:

f0 = new SimpleDateFormat( "yyyy-MM-dd" ),
f1 = new SimpleDateFormat( "dd-MMM-yy" ),
f2 = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss:0" );

我没有考虑时区,你可能也想考虑一下,除非数据库只包含一个时区的数据。

那你可以

switch( day.length() ) {
  case 10: return f0.parse( day );
  case 21: return f1.parse( day );
  default: throw Exception( "..." ); // invalid format
}

当然,最好定义适当的格式常量,以便更好地记录 10 和 21 的含义。

只需使用简单日期格式模式来解析日期- doc, examples 可以在同一页面上找到

对于短格式的月份,请注意,格式为MMM

示例:

        String date1 = "2017-01-01 00:00:00:0";
        String date2 = "01-JAN-17";


        final String datePattern1 = "YYYY-dd-MM HH:mm:ss:S";
        final String datePattern2 = "dd-MMM-yy";

        SimpleDateFormat sdf1 = new SimpleDateFormat(datePattern1);
        SimpleDateFormat sdf2 = new SimpleDateFormat(datePattern2);

        try {
            System.out.println("date1: "  + sdf1.parse(date1));
            System.out.println("date2: " + sdf2.parse(date2));
        } catch (Exception e) {
            e.printStackTrace();
        }

产出

date1: Sun Jan 01 00:00:00 CET 2017
date2: Sun Jan 01 00:00:00 CET 2017

btw SimpleDateFormat.parse can throw unparsable exception

您可以使用一种方法来尝试匹配数据库中的任一字符串格式;

如果有匹配项,则将 日期字符串 --- 转换为 ----> 日期对象 。 然后将 日期对象 -- 转换为 --> 新格式 的日期字符串。

为此,您需要为每次字符串匹配尝试:

  • 模式实例
  • 从数据库输入的日期的正则表达式
  • 用于将日期字符串解析为日期对象的日期格式字符串

然后只需将日期对象转换为您想要的字符串格式。

在代码中,它看起来像这样

// stuff for the first format out of the db
String dateInput_1 = "2017-01-01 00:00:00:0";
String dateInput_1_Regex = "\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}:\d{1}";
String dateInputFormat_1 = "yyyy-MM-dd HH:mm:ss:S";
Pattern pattern_1 = Pattern.compile(dateInput_1_Regex);

// stuff for the second format out of the db
String dateInput_2 = "01-JAN-17";
String dateInput_2_Regex = "\d{2}-[A-Z]{3}-\d{2}";
String dateInputFormat_2 = "dd-MMM-yy";
Pattern pattern_2 = Pattern.compile(dateInput_2_Regex);

// Dateformat and Date for converting/parsing between Date and Date-String
SimpleDateFormat sdf;
Date tempDate = null;

// if there is a match for the first date format string out the db,
if (pattern_1.matcher(dateInput_1).matches()) {
    sdf = new SimpleDateFormat(dateInputFormat_1);
    // store in a neutral date;
    tempDate = sdf.parse(dateInput_1);
}

// if there is a match for the second date format string out the db,
else if (pattern_2.matcher(dateInput_2).matches()) {
    sdf = new SimpleDateFormat(dateInputFormat_2);
    // store in a neutral date;
    tempDate = sdf.parse(dateInput_2);
}

// no matter which match was done, convert it to your expected Date String
String newDateString = new SimpleDateFormat("yyyy-MM-dd").format(tempDate);
System.out.println("new Date: " + newDateString);
  • 首先与 Pattern objet 匹配将有助于控制代码流,并允许仅对您的 parsing/formatting 作业使用 SimpleDateFormat,从而避免使用异常来控制流程。
  • 命名变量是为了更容易理解。