我尝试仅使用 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
您也许应该使用 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); … }
,但正如您所说,这种情况很少发生。请注意,当整个匹配已经是您想要的时,您不需要捕获组。
–
|
YYYY
是一场灾难。这是测试无法发现的错误。您想要yyyy
.TemporalAccessorz
什么也不会给您 – 使用LocalDateTime.parse
,因为该字符串是..本地日期时间。它有一个getYear
方法。Beck-воин 为您提供了一个带有片段的答案。–
–
"AM/PM"
依赖于语言环境且发布的代码使用的是默认代码(可能是正确的,也可能不是)–
–
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy hh:mm:ss a");
你可以轻松使用,例如,int year = formatter.parse(ts).get( ChronoField.YEAR);
尽管 WJSYear.parse(ts, formatter).getValue()
可能更可取。–
|