JAVA - 以唯一格式解析两个不同的Date字符串

时间:2017-12-01 09:46:09

标签: java date-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

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

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

换句话说,我需要一个“黑匣子”代码,在输入中给出一个未知字符串,将其转换为 yyyy-MM-dd

由于

5 个答案:

答案 0 :(得分:2)

您可能希望将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的含义。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

您可以在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);
   }

答案 3 :(得分:0)

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

对于月份的简短格式,请注意,格式为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可以抛出不可解决的异常

答案 4 :(得分:0)

您可以使用尝试匹配db的任何String格式的方法;

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

为每个字符串匹配尝试需要:

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

然后只将日期对象转换为您想要的String格式。

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

// 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匹配将有助于控制代码流,并允许仅将SimpleDateFormat用于解析/格式化作业,从而避免使用异常来控制流。
  • 变量被命名以使底层更容易。