我想使用 DateTimeFormatterBuilder () 将日期从 String 转换为 LocalDateTime
I want to convert a date from String to LocalDateTime using DateTimeFormatterBuilder ()
不将 16 索引下日期的最后一位转换为
private LocalDateTime parseDate(String date) {
dateOut = LocalDateTime.parse(date, fmt);
出现错误:
java.time.format.DateTimeParseException: Text '27 апр 21, 01:42' could
not be parsed at index 16
我找不到答案。
谢谢你的回答。
public class HtmlParse {
private LocalDateTime lastDate = null;
private LocalDateTime dateTime = null;
private DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.appendPattern("d ")
.appendText(ChronoField.MONTH_OF_YEAR, new HashMap<>() { {
put(1L, "янв"); put(2L, "фев"); put(3L, "мар"); put(4L, "апр");
put(5L, "май"); put(6L, "июн"); put(7L, "июл"); put(8L, "авг");
put(9L, "сен"); put(10L, "окт"); put(11L, "ноя"); put(12L, "дек");
} })
.appendPattern(" yy, HH:mm")
.toFormatter(new Locale("ru"));
public void setLastDate(LocalDateTime lastDate) {
this.lastDate = lastDate;
}
private LocalDateTime parseDate(String date) {
LocalDateTime dateOut;
dateOut = LocalDateTime.parse(date, fmt);
return dateOut;
}
public Post detail(String postLink) {
Post post = null;
try {
Document doc = Jsoup.connect(postLink).get();
String name = doc.title().split(" / Вакансии")[0];
String text = doc.select("td.msgBody").get(1).text();
String date = doc.select("td.msgFooter").get(0).text();
this.dateTime = this.parseDate(date.substring(0, date.indexOf("[")));
post = new Post(name, text, dateTime, postLink);
} catch (IOException e) {
LOG.error(e.getMessage(), e);
}
return post;
}
public static void main(String[] args) throws SchedulerException {
String link = "https://www.sql.ru/forum/job-offers/";
HtmlParse htmlParse = new HtmlParse();
htmlParse.setLastDate(LocalDateTime.of(2020, 1, 1, 0, 0));
List<Post> list = htmlParse.parser(link);
for (Post p : list) {
System.out.println(p);
}
}
}
正如我在问题下方评论的那样,问题的原因是在模式末尾添加了空格。将 .appendPattern(" yy, HH:mm ")
替换为 .appendPattern(" yy, HH:mm")
以使其工作。
如果您的应用程序收到的日期字符串有尾随或前导空格,您可以使用 String#trim
将其删除,例如
String strDateTime = "27 апр 21, 01:42 ";
strDateTime = strDateTime.trim();
如果您的日期时间字符串嵌入在一些大文本中,您可以使用 regex 来提取日期时间字符串
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String args[]) {
String str = "Отношения между Индией и Россией были одними из самых глубоких дружеских отношений в мировой истории. 27 апр 21, 01:42 Русские и индийцы невероятно любят и уважают друг друга.";
Matcher matcher = Pattern.compile("\d{1,2}\s+\p{L}{3}\s+\d{1,2},\s+\d{1,2}:\d{1,2}").matcher(str);
String strDateTime = "";
if (matcher.find()) {
strDateTime = matcher.group();
}
System.out.println(strDateTime);
}
}
输出:
27 апр 21, 01:42
除此之外,如果您使用的是 Java SE 9,我建议您使用 Map#ofEntries
来初始化 Map
。
演示:
import static java.util.Map.entry;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;
import java.util.Map;
public class Main {
public static void main(String args[]) {
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.appendPattern("d ")
.appendText(ChronoField.MONTH_OF_YEAR, Map.ofEntries(
entry(1L, "янв"), entry(2L, "фев"), entry(3L, "мар"), entry(4L, "апр"),
entry(5L, "май"), entry(6L, "июн"), entry(7L, "июл"), entry(8L, "авг"),
entry(9L, "сен"), entry(10L, "окт"), entry(11L, "ноя"), entry(12L, "дек")
))
.appendPattern(" yy, HH:mm")
.toFormatter(new Locale("ru"));
LocalDateTime ldt = LocalDateTime.parse("27 апр 21, 01:42", fmt);
System.out.println(ldt);
}
}
输出:
2021-04-27T01:42
不将 16 索引下日期的最后一位转换为
private LocalDateTime parseDate(String date) {
dateOut = LocalDateTime.parse(date, fmt);
出现错误:
java.time.format.DateTimeParseException: Text '27 апр 21, 01:42' could not be parsed at index 16
我找不到答案。 谢谢你的回答。
public class HtmlParse {
private LocalDateTime lastDate = null;
private LocalDateTime dateTime = null;
private DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.appendPattern("d ")
.appendText(ChronoField.MONTH_OF_YEAR, new HashMap<>() { {
put(1L, "янв"); put(2L, "фев"); put(3L, "мар"); put(4L, "апр");
put(5L, "май"); put(6L, "июн"); put(7L, "июл"); put(8L, "авг");
put(9L, "сен"); put(10L, "окт"); put(11L, "ноя"); put(12L, "дек");
} })
.appendPattern(" yy, HH:mm")
.toFormatter(new Locale("ru"));
public void setLastDate(LocalDateTime lastDate) {
this.lastDate = lastDate;
}
private LocalDateTime parseDate(String date) {
LocalDateTime dateOut;
dateOut = LocalDateTime.parse(date, fmt);
return dateOut;
}
public Post detail(String postLink) {
Post post = null;
try {
Document doc = Jsoup.connect(postLink).get();
String name = doc.title().split(" / Вакансии")[0];
String text = doc.select("td.msgBody").get(1).text();
String date = doc.select("td.msgFooter").get(0).text();
this.dateTime = this.parseDate(date.substring(0, date.indexOf("[")));
post = new Post(name, text, dateTime, postLink);
} catch (IOException e) {
LOG.error(e.getMessage(), e);
}
return post;
}
public static void main(String[] args) throws SchedulerException {
String link = "https://www.sql.ru/forum/job-offers/";
HtmlParse htmlParse = new HtmlParse();
htmlParse.setLastDate(LocalDateTime.of(2020, 1, 1, 0, 0));
List<Post> list = htmlParse.parser(link);
for (Post p : list) {
System.out.println(p);
}
}
}
正如我在问题下方评论的那样,问题的原因是在模式末尾添加了空格。将 .appendPattern(" yy, HH:mm ")
替换为 .appendPattern(" yy, HH:mm")
以使其工作。
如果您的应用程序收到的日期字符串有尾随或前导空格,您可以使用 String#trim
将其删除,例如
String strDateTime = "27 апр 21, 01:42 ";
strDateTime = strDateTime.trim();
如果您的日期时间字符串嵌入在一些大文本中,您可以使用 regex 来提取日期时间字符串
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String args[]) {
String str = "Отношения между Индией и Россией были одними из самых глубоких дружеских отношений в мировой истории. 27 апр 21, 01:42 Русские и индийцы невероятно любят и уважают друг друга.";
Matcher matcher = Pattern.compile("\d{1,2}\s+\p{L}{3}\s+\d{1,2},\s+\d{1,2}:\d{1,2}").matcher(str);
String strDateTime = "";
if (matcher.find()) {
strDateTime = matcher.group();
}
System.out.println(strDateTime);
}
}
输出:
27 апр 21, 01:42
除此之外,如果您使用的是 Java SE 9,我建议您使用 Map#ofEntries
来初始化 Map
。
演示:
import static java.util.Map.entry;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;
import java.util.Map;
public class Main {
public static void main(String args[]) {
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.appendPattern("d ")
.appendText(ChronoField.MONTH_OF_YEAR, Map.ofEntries(
entry(1L, "янв"), entry(2L, "фев"), entry(3L, "мар"), entry(4L, "апр"),
entry(5L, "май"), entry(6L, "июн"), entry(7L, "июл"), entry(8L, "авг"),
entry(9L, "сен"), entry(10L, "окт"), entry(11L, "ноя"), entry(12L, "дек")
))
.appendPattern(" yy, HH:mm")
.toFormatter(new Locale("ru"));
LocalDateTime ldt = LocalDateTime.parse("27 апр 21, 01:42", fmt);
System.out.println(ldt);
}
}
输出:
2021-04-27T01:42