我正在尝试重新格式化一些日期字符串。他们中的一些人在开始的那一年有一年,我希望他们的年份能够结束。我还想将分隔符标准化为下划线。
示例输入:
07_April_2008
16_05_2012
2016-01-28
14/12/2009
期望的输出:
07_April_2008
16_05_2012
01_28_2016
14_12_2009
这是我的第一次尝试,但是当我这样做时出现错误:
public String format(String date) {
String[] format = null;
date = date.replace("-", "_");
date = date.replace("/", "_");
if (date.contains("_")) {
format = date.split("_");
// new arrayList to add rearrangement to
ArrayList<String> formatNew = new ArrayList<String>();
for (int i = 0; i < format.length; i++) {
if (format[i].matches("\\d{4}")) {
formatNew.add(2, format[i]);
} else {
formatNew.add(format[i]);
}
}
}
return date;
}
这会产生错误:
java.lang.IndexOutOfBoundsException:Index:2,Size:0
我认为这一年很好,但数组中的其他两个元素没有。
答案 0 :(得分:1)
来自Java doc
将指定元素插入此列表中的指定位置。将当前位置的元素(如果有)和任何后续元素向右移动(在其索引中加1)。
以下是ArrayList.add(index,E)
方法源代码
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
...
所以很明显,如果index
大于size
或否定则会IndexOutOfBoundsException
。
查看DateFormatUtils它有多种标准日期格式,您可以格式化日期
答案 1 :(得分:1)
我会将其视为字符串问题:
List<String> dates; // given this
dates = dates.stream()
.map(s -> s.replaceAll("\\W", "_")) // anything not a letter or number becomes _
.map(s -> s.replaceAll("(\\d{4})_(.*)", "$2_$1")) // reorganise leading year dates
.collect(Collectors.toList());
如果您只想格式化日期字符串:
str.replaceAll("\\W", "_").replaceAll("(\\d{4})_(.*)", "$2_$1")
如果要保留分隔符(仅更改为下划线以使代码正常工作):
str.replaceAll("(\\d{4})(.)(.*)", "$3$2$1")