如何在Calendar对象中以dd MMM yyyy格式转换String

时间:2019-06-11 08:31:25

标签: java date calendar

我正在尝试将格式为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日”

您能帮我修复它吗?谢谢。

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。