我想创建一个日期数组并对其进行排序。这就是我能够做到的,但这不是我所要求的。
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy");
java.util.Date date1 = sdf.parse("05-03-2014");
java.util.Date date2 = sdf.parse("23-08-2014");
java.util.Date dates[] = {date1, date2};
java.util.Arrays.sort(dates);
System.out.println(java.util.Arrays.toString(dates));
因为我有一个字符串数组"字符串日期[] = {" 05-11-2014"," 23-08-2014"," 05 -02-2013"};" 所以我必须在字符串数组中对日期进行排序。如何更改代码?
答案 0 :(得分:7)
更好的方法是将String
数组转换为Date
数组
Date[] arrayOfDates = new Date[dates.length];
for (int index = 0; index < dates.length; index++) {
arrayOfDates[index] = sdf.parse(dates[index]);
}
然后对arrayOfDates
进行排序,如果需要,请使用SimpleDateFormat
将结果格式化回dates
数组...
Arrays.sort(arrayOfDates);
for (int index = 0; index < dates.length; index++) {
dates[index] = sdf.format(arrayOfDates[index]);
}
如果dates
数组中的一个或多个值格式无效,则可以更好地控制应该执行的操作。
另一个“脏”的解决方案是使用自定义Comparator
,将值转换为内联Date
并进行比较。
如果你可以保证dates
的有效性,这是可以的,但是如果你不能,那就开始分崩离析了,例如......
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DirtySort {
public static void main(String[] args) {
String dates[] = {"05-11-2014", "23-08-2014","05-02-2013"};
Arrays.sort(dates, new Comparator<String>() {
private SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy");
@Override
public int compare(String o1, String o2) {
int result = -1;
try {
result = sdf.parse(o1).compareTo(sdf.parse(o2));
} catch (ParseException ex) {
ex.printStackTrace();
}
return result;
}
});
for (String date : dates) {
System.out.println(date);
}
}
}
答案 1 :(得分:1)
answer by MadProgrammer是正确的。使用日期时间值时,请将它们用作日期时间数据类型。这通常是最好的。如果您有一堆表示数字的字符串,那么您是否不能为业务逻辑转换为数字数据类型?
java.util.Date
我对另一个答案的唯一改进是建议不要使用java.util.Date。与Java捆绑在一起的类和.Calendar都是众所周知的麻烦,应该避免。
而是使用受Joda-Time启发的Java 8中的Joda-Time库或新的java.time package。
Joda-Time和java.time都提供LocalDate
类来处理没有任何时间或时区的仅限日期的值。就这个问题而言。
我们使用DateTimeFormatter
通过调用parseLocalDate
来解析字符串。如果您不信任您的数据源,请陷阱IllegalArgumentException
。
以下是一些使用Joda-Time 2.4的代码。
List<LocalDate> list = new ArrayList<LocalDate>();
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );
String dates[] = { "05-11-2014" , "23-08-2014" , "05-02-2013" };
for ( String string : dates ) {
LocalDate localDate = formatter.parseLocalDate( string );
list.add( localDate );
}
Collections.sort( list );
转储到控制台。以原始格式输出。
System.out.println( "list: " + list );
StringBuilder output = new StringBuilder( "Localized sorted list of dates: " );
for ( LocalDate localDate : list ) {
output.append( formatter.print( localDate ) ).append( " | " );
}
System.out.println( output );
跑步时。
list: [2013-02-05, 2014-08-23, 2014-11-05]
Localized sorted list of dates: 05-02-2013 | 23-08-2014 | 05-11-2014 |
或者,使用带有lambdas的新Java 8语法。不确定这是否有所改善。
List<LocalDate> list = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );
String[] dateStringsArray = { "05-11-2014" , "23-08-2014" , "05-02-2013" };
List<String> dateStringsList = new ArrayList<>( Arrays.asList( dateStringsArray ) );
dateStringsList.stream().map( ( string ) -> formatter.parseLocalDate( string ) ).forEach( ( localDate ) -> {
list.add( localDate );
} );
Collections.sort( list );
System.out.println( "list: " + list );
StringBuilder output = new StringBuilder( "Localized sorted list of dates: " );
list.stream().forEach( ( localDate ) -> {
output.append( formatter.print( localDate ) ).append( " | " );
} );
System.out.println( output );