我尝试仅使用 java.time。以下代码片段:

var ts = "5/7/2024 10:02:04 AM";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/YYYY hh:mm:ss a");
TemporalAccessor as = formatter.parse(ts);
System.out.println(as.toString());

生产:
{MonthOfYear=5, WeekBasedYear[WeekFields[SUNDAY,1]]=2024, DayOfMonth=7},ISO resolved to 10:02:04
是否可以从中提取年份?

这种方式是不是完全错误呢?

12

  • 2
    YYYY是一场灾难。这是测试无法发现的错误。您想要yyyy.TemporalAccessorz什么也不会给您 – 使用LocalDateTime.parse,因为该字符串是..本地日期时间。它有一个getYear方法。Beck-воин 为您提供了一个带有片段的答案。


    – 

  • 1
    @ElliottFrisch 当已经有一个库来解析日期时,拆分字符串不是一个好主意,此外,如果日期格式发生变化怎么办?


    – 

  • 3
    还要注意,"AM/PM"依赖于语言环境且发布的代码使用的是默认代码(可能是正确的,也可能不是)


    – 

  • 1
    大写 YYYY 表示周数年份;周数可以描述两个日历年的周数。因此请使用 yyyy 或 uuuu。


    – 

  • 1
    @rzwitserloot 我不会说时间访问器“什么都没给你”。当修复模式时,正如你所说,DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy hh:mm:ss a");你可以轻松使用,例如,int year = formatter.parse(ts).get( ChronoField.YEAR);尽管 WJSYear.parse(ts, formatter).getValue()可能更可取。


    – 



最佳答案
2

您也许应该使用 LocalDateTime :

var ts = "5/7/2024 10:02:04 AM";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy hh:mm:ss a");
LocalDateTime dateTime = LocalDateTime.parse(ts, formatter);
int year = dateTime.getYear();
System.out.println("Year: " + year);

0

如果您只想要年份,也可以按如下方式操作:

String format = "5/7/2024 10:02:04 AM";
DateTimeFormatter  = dtf
     DateTimeFormatter.ofPattern("M/d/yyyy hh:mm:ss a");
int year = Year.parse("5/7/2024 10:02:04 AM",dtf).getValue();
System.out.println(year);

印刷

2024

注意:正如上面的评论中所提到的,由于对 的偏好,可能无法适用于某些区域am/pm设置AM/PM

另一种选择是使用正则表达式。这种方法的效果明显优于使用java.time类来解析日期。但从总体上看,日期/时间解析可能不是整体性能的瓶颈。

Matcher m = Pattern.compile("(\\d{4})").matcher(format);

if (m.find()) {
     String year = m.group(1);
     System.out.println(Integer.valueOf(year));
}

印刷

2024

1

  • 2
    当性能成为关注点时,您可能会使用if(m.find()) { int year = Integer.parseInt(format, m.start(), m.end(), 10); … },但正如您所说,这种情况很少发生。请注意,当整个匹配已经是您想要的时,您不需要捕获组。


    –