我以两种不同的方式从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 。
由于
答案 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)
只需使用简单格式模式来解析日期 - 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
可以抛出不可解决的异常
答案 4 :(得分:0)
您可以使用尝试匹配db的任何String格式的方法;
如果匹配则将日期字符串---转换为---->日期对象。 然后转换日期对象 - 到 - >新格式的日期字符串。
为每个字符串匹配尝试需要:
然后只将日期对象转换为您想要的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);