我正在尝试将格式为2019年5月2日的字符串转换为Calendar对象。
所以我写了这段代码:
String currentDate = "02 MAY 2019"
Date dateFormatted = new SimpleDateFormat("dd/MM/yyyy").parse(currentDate)
Calendar c = Calendar.getInstance()
c.setTime(dateFormatted)
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK)
String month = c.get(Calendar.MONTH)
但是,我遇到了这个错误:
org.codehaus.groovy.runtime.InvokerInvocationException: java.text.ParseException:无法解析的日期:“ 2019年5月2日”
您能帮我修复它吗?谢谢。
答案 0 :(得分:2)
如果在Java 8上,则可以在下面使用:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.TextStyle;
import java.util.Locale;
代码:
String currentDate = "02 MAY 2019";
//case insenstive parsing
DateTimeFormatter formatter =
new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern("dd MMM yyyy").toFormatter();
LocalDate date = LocalDate.parse(currentDate, formatter);
//get directly from LocalDate what was intended from Calendar
int dayOfWeek = date.getDayOfWeek().getValue();
String month = date.getMonth().getDisplayName(TextStyle.SHORT, Locale.getDefault());
System.out.printf("dayOfWeek %d and month %s", dayOfWeek, month);
答案 1 :(得分:2)
好吧,仅使用第一个答案和我自己在评论中建议的模式似乎是不够的。
我只是自己尝试了一次,也得到了DateTimeParseException
。
我终于找到了一些可以满足您需求的代码,但是它似乎需要一定的Locale
:
public static void main(String args[]) {
String currentDate = "02 MAY 2019";
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.parseLenient()
.appendPattern("dd MMM yyyy")
// does not work without the Locale:
.toFormatter(Locale.ENGLISH);
DateTimeFormatter dtfIso = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate d = LocalDate.parse(currentDate, dtf);
System.out.println(d.format(dtfIso));
}
这将导致输出
02/05/2019
显然,在为这种(不常见的?)模式定义
DateTimeFormatter
时,必须注意方法调用的顺序。另外,不提供Locale
或提供与Locale.ENGLISH
不同的内容似乎会导致DateTimeParseException
,我将其更改为Locale.getDefault()
(在我的情况下为GER),而{ {1}}发出了一条有趣的消息,因为我的错误像以前一样批评索引4,而不是3。