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

JAVA-以唯一格式解析两个不同的日期字符串,java,date-format,Java,Date Format,我以两种不同的方式从Oracle数据库中提取日期信息:通过查询和通过存储过程。 我通过读数读取数值 String day = rs.getString("DAY"); 获得: by query: 2017-01-01 00:00:00:0 by stored procedure: 01-JAN-17 我需要将它们转换为一种独特的格式,即 yyyy-MM-dd 我事先不知道该值将如何提取(查询或存储),因此我不知道该格式是什么 是否有一种通用的转换目标格式的方法? 我正在寻找一种将两个不同的

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

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


谢谢

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

来自矿山项目的示例:

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);
   }
您可能希望与以下格式一起使用:

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的含义。

只需使用simpledate格式模式解析日期-,就可以在同一页上找到

对于短格式的月份,请注意,模式为
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
顺便说一句,SimpleDataFormat.parse可以引发不可分析的异常


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

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

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

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

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

// 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);
  • 首先与模式对象匹配将有助于控制代码流,并允许仅在解析/格式化作业中使用SimpleDataFormat,从而避免使用异常来控制流
  • 命名变量是为了更容易理解

我知道如何将字符串转换为日期的可能重复项。我正在寻找一种通用方法,以独特的输出格式解析两个不同的输入字符串。更好的方法是从数据库检索对象,而不仅仅是字符串:
LocalDate ld=myResultSet.getObject(“DAY”,LocalDate.class)
@BasilBourque绝对正确。此外,您还可以从
LocalDate.toString()
(前提是日期在公共纪元中)获得所需的格式,
yyy-MM-dd
,很难做到这一点。抛出和捕获异常非常缓慢,因此防止异常发生的解决方案要好得多。很抱歉,使用try/catch块作为流控制被认为是不好的/最佳做法。请不要教年轻人使用早已过时的类
SimpleDateFormat
和朋友。今天我们有了更好的答案。这个答案使用了麻烦的旧日期时间类,这些类现在是遗留的,几年前被java.time类取代。请不要教年轻人使用过时很久的类
SimpleDateFormat
和朋友。今天我们有了更好的答案。这个答案使用了麻烦的旧日期时间类,这些类现在是遗留的,几年前被java.time类取代。谢谢,你可能是对的,有一天所有的类都会被弃用。所以我应该补充一点,这个解决方案应该适用于Java 1.2到8。这个答案使用了麻烦的旧日期时间类,这些类现在是遗留的,几年前被Java.time类取代。