问题描述
我想在 Java 中将此日期转换为“yyyy-MM-dd”格式。有什么办法可以做到这一点。
解决方法
java.time
我建议您使用 java.time,现代 Java 日期和时间 API,用于您的日期工作。
为了解析所有大写的月份缩写(如 SEP
),我们需要指示它应用不区分大小写的解析。
我们可以使用 DateTimeFormatterBuilder
用这样的指令构建一个 DateTimeFormatter
。
private static final DateTimeFormatter oracleFormatter
= new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("dd-MMM-uu")
.toFormatter(Locale.ROOT);
其余的都很顺利:
String stringFromOracle = "01-SEP-22";
LocalDate date = LocalDate.parse(stringFromOracle,oracleFormatter);
String formattedString = date.toString();
System.out.println(formattedString);
输出为:
2022-09-01
为了生成字符串,我正在利用 LocalDate.toString()
提供您要求的格式这一事实,因此我没有明确使用任何格式化程序。该格式称为 ISO 8601,顾名思义,是一种国际标准。
改进建议
- 不要从 Oracle 检索您的日期作为
String
。直接检索LocalDate
并保存解析。 - 不要将日期从一种字符串格式转换为另一种格式。在您的程序中,将日期保留为
LocalDate
。如果您需要接受字符串输入(这里不是这种情况),请立即将字符串解析为LocalDate
。仅当您需要将字符串输出(例如给用户或与其他系统进行数据交换)时,将LocalDate
格式化为所需格式的字符串。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time。
- Wikipedia article: ISO 8601
- Question: Insert & fetch java.time.LocalDate objects to/from an SQL database such as H2
您可以简单地使用 DateTimeFormatter
:
public String convertDate(String dateStr) throws ParseException {
String[] split = dateStr.split("-");
split[1] = split[1].substring(0,1).toUpperCase() + split[1].substring(1).toLowerCase();
dateStr = String.join("-",split);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MMM-yy",Locale.ENGLISH);
LocalDate date = LocalDate.parse(dateStr,dateFormatter);
return date.toString();
}
@Test
public void test_convertDate() throws ParseException {
assertEquals("2022-09-01",convertDate("01-SEP-22"));
}