java 2013年12月23日使用MM/dd/yyyy格式进行Map,为什么不使用ParseException

yb3bgrhw  于 2023-01-01  发布在  Java
关注(0)|答案(6)|浏览(194)

有人能帮忙吗?

public void dateCalender() throws ParseException{
        System.out.println(new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse("120/12/2013").toString()); //OUTPUT (Unexpected): Mon Dec 12 00:00:00 IST 2022
        System.out.println(new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse("23/12/2013").toString()); //OUTPUT (Unexpected): Wed Nov 12 00:00:00 IST 2014
        System.out.println(new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse("Jan/12/2013").toString()); //OUTPUT (Expected): Unparseable date: "Jan/12/2013"
    }
mcvgt66p

mcvgt66p1#

必须使用false调用setLenient-否则SimpleDateFormat将试图“找出”月份,因此,首先创建SimpleDateFormat并调用sdf.setLenient(false),现在解析时将得到异常。

vmjh9lq9

vmjh9lq92#

根据文档**,解析是宽松的**,因此您没有收到无效输入的异常。它已转换为另一个值。
默认情况下,解析是宽松的:如果输入不是该对象的format方法使用的格式,但仍然可以解析为日期,则解析成功。客户端可以通过调用setLenient(false)来坚持严格遵守格式。
如果你想得到java.text.ParseException: Unparseable date:,那么在SimpleDateFormat处应用setLenient(false);

String dateStr="120/12/2013";
    SimpleDateFormat sdf=new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);
    sdf.setLenient(false);
    try {
        Date d=sdf.parse(dateStr);
    } catch (ParseException ex) {
        ex.printStackTrace();
    }
k4emjkb1

k4emjkb13#

来自文档:

public void setLenient(boolean lenient)

您需要将格式设置为非宽松。

xmd2e60i

xmd2e60i4#

关于前两项:

MM/dd/yyyy 120/12/2013

编译器会将其视为'12/12/2013 + 118 months',并从本质上求解出正确的日期。在您的示例中,结果为December 12,2022(12/12/2013 + 9 years)。

MM/dd/yyyy 23/12/2013

同样的事情也会发生。你会得到“12/12/2013 + 9个月”,或者11/12/2014。
第三种格式不是MM/dd/yyyy格式,从其他答案中可以看出,你可以这样做:

SystemDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);
sdf.setLenient(true);
sdf.parse("Jan/12/2013");
System.out.println(sdf.toString());
jhkqcmku

jhkqcmku5#

* Java时间 *

Question和accepted answer使用java.util日期时间API及其格式化API SimpleDateFormat,这在2013年是正确的做法。2014年3月,modern Date-Time API取代了传统的日期时间API,从那时起,强烈建议切换到现代日期时间API java.time

    • 使用java.time(现代日期-时间API)的解决方案:**

java.time非常聪明,无需任何显式设置即可捕获大多数此类问题。自定义的DateTimeFormatter默认设置为ResolverStyle#SMART,它不允许月份超出1 - 12的范围,也不允许日期值超过31。但是,也就是说02/31/2022可以用DateTimeFormatter.ofPattern("MM/dd/uuuu")解析为2022-02-28,只是不允许这样的解析,需要设置ResolverStyle.#STRICT

    • 演示:**
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Locale;

class Main {
    public static void main(String[] args) {
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("MM/dd/uuuu", Locale.ENGLISH);
        String arr[] = {
                "120/12/2013", // 120 will be discarded against MM
                "23/12/2013", // Month can not be outside the range 1-12
                "Jan/12/2013", // Jan will discarded against MM. Requires MMM
                "12/31/2022", // Will be parsed normally
                "02/31/2022" // Will be parsed to 2022-02-28
        };
        for (String s : arr) {
            try {
                System.out.println("===========================");
                System.out.println("Trying to parse " + s + " using the format MM/dd/uuuu");
                System.out.println("Parsed to " + LocalDate.parse(s, parser));
            } catch (DateTimeParseException e) {
                System.out.println(e.getMessage());
                // throw e;
            }
        }
    }
}
    • 输出:**
===========================
Trying to parse 120/12/2013 using the format MM/dd/uuuu
Text '120/12/2013' could not be parsed at index 2
===========================
Trying to parse 23/12/2013 using the format MM/dd/uuuu
Text '23/12/2013' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 23
===========================
Trying to parse Jan/12/2013 using the format MM/dd/uuuu
Text 'Jan/12/2013' could not be parsed at index 0
===========================
Trying to parse 12/31/2022 using the format MM/dd/uuuu
Parsed to 2022-12-31
===========================
Trying to parse 02/31/2022 using the format MM/dd/uuuu
Parsed to 2022-02-28

ONLINE DEMO

    • ResolverStyle.#STRICT的演示**:
class Main {
    public static void main(String[] args) {
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("MM/dd/uuuu", Locale.ENGLISH)
                .withResolverStyle(ResolverStyle.STRICT);
        String arr[] = {
                "12/31/2022", // Will be parsed normally
                "02/31/2022" // Will fail against ResolverStyle.STRICT check
        };
        for (String s : arr) {
            try {
                System.out.println("===========================");
                System.out.println("Trying to parse " + s + " using the format MM/dd/uuuu");
                System.out.println("Parsed to " + LocalDate.parse(s, parser));
            } catch (DateTimeParseException e) {
                System.out.println(e.getMessage());
                // throw e;
            }
        }
    }
}
    • 输出**:
===========================
Trying to parse 12/31/2022 using the format MM/dd/uuuu
Parsed to 2022-12-31
===========================
Trying to parse 02/31/2022 using the format MM/dd/uuuu
Text '02/31/2022' could not be parsed: Invalid date 'FEBRUARY 31'

ONLINE DEMO

    • 注意**:在这里,您可以使用y代替u,但是可以使用I preferuy

从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

kq4fsx7k

kq4fsx7k6#

您使用的格式是MM/dd/yyyy,因此它有两个位置
你试试这样:
系统.输出.打印输入(新的简单日期格式(“年/月/日”,区域设置.英语).解析(“2013年1月12日”).toString());
这里不会抛出无法解析的异常,但我不担心它是否有效
我认为每次只使用MM/DD/YYYY格式作为“1/12/2013”时,这将是错误的方式

相关问题