Java 最新日期表单字符串列表,包括月份名称

Java 最新日期表单字符串列表,包括月份名称,java,date,Java,Date,您好,我正在寻找一种快速而紧凑的方法,从具有以下格式的日期的ArrayList中获取最新日期(我打算从数据库生成此日期)。ArrayList的内容将采用以下格式 ArrayList<String> datelist=new ArrayList<String>(); datelist.add("October 09, 2019"); datelist.add("August 20, 2018"); datelist.add("October 09, 2019"); dat

您好,我正在寻找一种快速而紧凑的方法,从具有以下格式的日期的
ArrayList
中获取最新日期(我打算从数据库生成此日期)。
ArrayList
的内容将采用以下格式

ArrayList<String> datelist=new ArrayList<String>(); 
datelist.add("October 09, 2019");
datelist.add("August 20, 2018");
datelist.add("October 09, 2019");
datelist.add("August 31, 2019");
ArrayList datelist=new ArrayList();
日期列表。添加(“2019年10月9日”);
日期列表。添加(“2018年8月20日”);
日期列表。添加(“2019年10月9日”);
日期列表。添加(“2019年8月31日”);
最终结果应该是类似于2019年10月9日的字符串 如有任何关于功能或逻辑的想法,将不胜感激

编辑:谢谢大家的建议:)。由于我需要一个用于大量原始数据处理的通用解决方案(正如在尝试您的所有建议时所发现的那样),而且上面是一个样本数据……出现了@deHaar提到的其他语言中提到的日期等问题,@Eritrean建议的方法最适合我

您的格式是“MMMM-dd,yyyy”

DateTimeFormatter format=DateTimeFormatter.of模式(“MMMM-dd,yyyy”);
可选的latest=datelist.stream()
.map(格式::parse)
.map(p->LocalDate.of(p.get(ChronoField.YEAR)、p.get(ChronoField.MONTH\u of\u YEAR)、p.get(ChronoField.DAY\u of\u MONTH)))
.max(LocalDate::compareTo);
字符串输出=latest.map(format::format).orElse(“无元素”);

从日期列表中获取最大日期的示例

将字符串列表转换为LocalDate列表,其余操作将由下面的代码处理

LocalDate maxDate = dates.stream()
                            .max( Comparator.comparing( LocalDate::toEpochDay ) )
                            .get();

LocalDate minDate = dates.stream()
                            .min( Comparator.comparing( LocalDate::toEpochDay ) )
                            .get();

您可以将日期
字符串
s转换/解析为可比较的对象,然后轻松找到最大值(最新/最新日期):

publicstaticvoidmain(字符串[]args){
//提供示例数据列表
List datelist=new ArrayList();
日期列表。添加(“2019年10月9日”);
日期列表。添加(“2018年8月20日”);
日期列表。添加(“2019年10月9日”);
日期列表。添加(“2019年8月31日”);
//创建本地日期列表
List localDates=new ArrayList();
datelist.forEach(日期->{
//使用匹配模式解析日期列表中的每个字符串
LocalDate LocalDate=LocalDate.parse(模式的date,DateTimeFormatter.of(“MMMM-dd,yyyy”);
//并将每个结果LocalDate添加到LocalDates列表中
添加(localDate);
});
//查找最近的LocalDate(此处的最大值)
LocalDate mostRecentDate=localDates.stream().max(LocalDate::compareTo.get();
//并以ISO格式(或您选择的格式)打印
System.out.println(mostRecentDate.format(DateTimeFormatter.ISO_LOCAL_DATE));
}
值得一提的是:这在我的(德语)系统上失败了,因为德国的
LocalDate
不知道十月,而是知道Oktober。我在那个月替换了
'c'
,它工作了。
这意味着您的系统必须是英文的,才能使此代码正常工作。

编辑

@Eritrean给出的答案完美地解决了地区问题,它使用了模式的日期时间格式(“MMMM-dd,yyyy”,locale.US);

,如评论中所述,类似于下面的方法应该可以工作:

    ArrayList<String> datelist=new ArrayList<>(); 
        datelist.add("October 09, 2019");
        datelist.add("August 20, 2018");
        datelist.add("October 09, 2019");
        datelist.add("August 31, 2019");

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM dd, yyyy", Locale.US);
        String maxDate = datelist.stream()
                .map(d -> LocalDate.parse(d, dtf))
                .max(Comparator.comparing(LocalDate::toEpochDay))
                .get().format(dtf);
        System.out.println(maxDate);
ArrayList datelist=new ArrayList();
日期列表。添加(“2019年10月9日”);
日期列表。添加(“2018年8月20日”);
日期列表。添加(“2019年10月9日”);
日期列表。添加(“2019年8月31日”);
DateTimeFormatter dtf=模式的DateTimeFormatter.of(“MMMM dd,yyyy”,Locale.US);
字符串maxDate=datelist.stream()
.map(d->LocalDate.parse(d,dtf))
.max(Comparator.comparing(LocalDate::toEpochDay))
.get().format(dtf);
System.out.println(maxDate);

尝试使用
LocalDate
DateTimeFormatter

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MMMM dd, yyyy");
String maxDate = datelist.stream()
        .map(str -> LocalDate.parse(str, dateTimeFormatter))
        .max(LocalDate::compareTo)
        .map(dateTimeFormatter::format)
        .orElse("N/A");

不要将字符串放入列表。放入
LocalDate
对象。就像你不会将数字作为字符串存储在列表中一样(我希望如此)

我还发现其他一些答案中的代码有点冗长。使用列表中的
LocalDate
对象,可以在一行中查找最新日期

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MMMM dd, uuuu", Locale.ENGLISH);

    List<LocalDate> dateList = new ArrayList<>(); 
    dateList.add(LocalDate.parse("October 09, 2019", dateFormatter));
    dateList.add(LocalDate.parse("August 20, 2018", dateFormatter));
    dateList.add(LocalDate.parse("October 09, 2019", dateFormatter));
    dateList.add(LocalDate.parse("August 31, 2019", dateFormatter));

    LocalDate latest = Collections.max(dateList);
    System.out.println("End result: " + latest.format(dateFormatter));

输出与以前相同。

将字符串解析为日期对象,最好是
LocalDate
对象,然后找到最大日期。为了简便起见,请使用streams。如果需要,将格式返回到字符串。使用有序集合,实现comparator并获取最后/第一个。如果使用的是java.util.date格式,则可以仅使用它在这个列表上运行,我认为有一个名为parseDate()的方法你不应该把字符串放在列表的第一位。创建一个
ArrayList
,并在将字符串添加到列表之前将其解析为
LocalDate
对象。这将使一切变得更容易,尤其是查找最新的字符串将非常容易。相关:请不要教年轻人使用long过时且臭名昭著的
SimpleDateFormat
类。至少不是第一个选项。也不是没有任何保留。今天我们在中有了更好的
DateTimeFormatter
也可以使用。没错,@MushifAliNawaz还有一个选项是
Comparator.naturalOrder()
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MMMM dd, yyyy");
String maxDate = datelist.stream()
        .map(str -> LocalDate.parse(str, dateTimeFormatter))
        .max(LocalDate::compareTo)
        .map(dateTimeFormatter::format)
        .orElse("N/A");
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MMMM dd, uuuu", Locale.ENGLISH);

    List<LocalDate> dateList = new ArrayList<>(); 
    dateList.add(LocalDate.parse("October 09, 2019", dateFormatter));
    dateList.add(LocalDate.parse("August 20, 2018", dateFormatter));
    dateList.add(LocalDate.parse("October 09, 2019", dateFormatter));
    dateList.add(LocalDate.parse("August 31, 2019", dateFormatter));

    LocalDate latest = Collections.max(dateList);
    System.out.println("End result: " + latest.format(dateFormatter));
    String latest = Collections.max(datelist,
            Comparator.comparing(s -> LocalDate.parse(s, dateFormatter)));
    System.out.println("End result: " + latest);