use*_*005 28 java sorting datetime
我有一个arraylist像字符串值
ArrayList<String> datestring=new ArrayList<String>();
datestring.add("01/21/2013 @03:13 PM");
datestring.add("01/21/2013 @04:37 PM");
datestring.add("01/21/2013 @10:41 AM");
datestring.add("01/21/2013 @10:48 AM");
datestring.add("01/22/2013 @06:16 AM");
datestring.add("01/22/2013 @06:19 AM");
datestring.add("01/21/2013 @05:19 PM");
datestring.add("01/21/2013 @05:19 PM");
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我整理上面的清单吗?以便根据AM和PM格式对值进行排序.
排序后的预期输出应该是
for (String s : datestring)
{
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
.
01/21/2013 @10:41 AM;
01/21/2013 @10:48 AM;
01/21/2013 @03:13 PM;
01/21/2013 @04:37 PM;
01/21/2013 @05:16 PM;
01/21/2013 @05:19 PM;
01/22/2013 @06:16 AM;
01/22/2013 @06:19 AM;
Run Code Online (Sandbox Code Playgroud)
Evg*_*eev 76
试试这个
Collections.sort(datestring, new Comparator<String>() {
DateFormat f = new SimpleDateFormat("MM/dd/yyyy '@'hh:mm a");
@Override
public int compare(String o1, String o2) {
try {
return f.parse(o1).compareTo(f.parse(o2));
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}
});
Run Code Online (Sandbox Code Playgroud)
或者使用Java 8
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy '@'hh:mm a");
Collections.sort(datestring, (s1, s2) -> LocalDateTime.parse(s1, formatter).
compareTo(LocalDateTime.parse(s2, formatter)));
Run Code Online (Sandbox Code Playgroud)
小智 8
可以使用下面给出的 compareTo 比较字符串格式的日期列表。
ArrayList<String> datestring=new ArrayList<String>();
datestring.add("01/21/2013 @03:13 PM");
datestring.add("01/21/2013 @04:37 PM");
datestring.add("01/21/2013 @10:41 AM");
datestring.add("01/21/2013 @10:48 AM");
datestring.add("01/22/2013 @06:16 AM");
datestring.add("01/22/2013 @06:19 AM");
datestring.add("01/21/2013 @05:19 PM");
datestring.add("01/21/2013 @05:19 PM");
Collections.sort(datestring, new Comparator<String>() {
@Override
public int compare(String object1, String object2) {
return object1.compareTo(object2);
}
});
Run Code Online (Sandbox Code Playgroud)
通过使用它,您甚至不必将字符串解析为日期
一种选择是将日期添加到 TreeMap,以未格式化的日期作为键,将格式化的日期作为值。使用 TreeMap 将自动对值进行排序。
private ArrayList<String> sortDates(ArrayList<String> dates) throws ParseException {
SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy");
Map <Date, String> dateFormatMap = new TreeMap<>();
for (String date: dates)
dateFormatMap.put(f.parse(date), date);
return new ArrayList<>(dateFormatMap.values());
}
Run Code Online (Sandbox Code Playgroud)
首先,正如鲍莫尔已经说过的,你不应该在列表中保留字符串。相反,使用java.time类的实例。
保留LocalDateTime物品。或者ZonedDateTime如果您知道时间位于哪个时区。字符串适合向用户展示,而不适合在程序中进行操作(例如排序)。
以下代码将您的列表转换为List<LocalDateTime>:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("MM/dd/uuuu '@'hh:mm a", Locale.ENGLISH);
List<LocalDateTime> dateTimeList = datestring.stream()
.map(ds -> LocalDateTime.parse(ds, formatter))
.collect(Collectors.toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)
现在排序很简单:
dateTimeList.sort(Comparator.naturalOrder());
Run Code Online (Sandbox Code Playgroud)
LocalDateTime由于它们实现了自然顺序Comparable,因此Comparator.naturalOrder()适合排序。获得相同排序的另一种方法是:
dateTimeList.sort(LocalDateTime::compareTo);
Run Code Online (Sandbox Code Playgroud)
当然,为了向用户呈现排序后的数据,我们希望将日期时间格式化为字符串:
dateTimeList.forEach(ldt -> System.out.println(ldt.format(formatter)));
Run Code Online (Sandbox Code Playgroud)
输出是:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("MM/dd/uuuu '@'hh:mm a", Locale.ENGLISH);
List<LocalDateTime> dateTimeList = datestring.stream()
.map(ds -> LocalDateTime.parse(ds, formatter))
.collect(Collectors.toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)
除了分号和一个简单的拼写错误之外,我相信这正是您所要求的。
链接: Oracle 教程:日期时间解释如何使用java.time,现代 Java 日期和时间 API,包括LocalDateTime和DateTimeFormatter。