无法在Java中的波兰语言环境中分析格式为d MMMM yyyy的日期

无法在Java中的波兰语言环境中分析格式为d MMMM yyyy的日期,java,date,locale,date-format,polish,Java,Date,Locale,Date Format,Polish,我试图在波兰语言环境中解析格式为d MMMM yyyy的日期(2020年12月3日),但无法解析。但是,为什么相同的解析在任何其他语言环境(如英语等)中都能正常工作呢?下面是不起作用的代码示例。有人能帮忙吗 Locale loc = new Locale("pl", "PL"); String date = "3 December 2020"; SimpleDateFormat sdFormat =

我试图在波兰语言环境中解析格式为d MMMM yyyy的日期(2020年12月3日),但无法解析。但是,为什么相同的解析在任何其他语言环境(如英语等)中都能正常工作呢?下面是不起作用的代码示例。有人能帮忙吗

    Locale loc = new Locale("pl", "PL");
    String date = "3 December 2020";
    SimpleDateFormat sdFormat =
            new SimpleDateFormat("d MMMM yyyy", loc);
    sdFormat.setLenient(false);
    try {
        Date d = sdFormat.parse(date);
        System.out.println(d);
    } catch (ParseException e) {
        e.printStackTrace();
    }

当试图确定解析问题时,请始终执行相反的操作,即生成输出,以查看解析输入的外观。这是一种非常适用于所有解析相关问题的技术,无论是解析日期字符串、XML文档、JSON文本等

因此,我们尝试使用给定格式打印日期值,以查看解析时的预期结果:

Locale loc=新的语言环境(“pl”、“pl”);
SimpleDataFormat sdFormat=新的SimpleDataFormat(“d MMMM yyyy”,loc);
sdFormat.setLenient(false);
Calendar cal=Calendar.getInstance(loc);
cal.clear();
cal.set(2020年,日历12月3日);
System.out.println(sdFormat.format(cal.getTime());
在Java7中,我得到了
3 grudzień2020

在Java8、9、11和14中,我得到了
3 grudnia2020


如果您想解析
2020年12月3日
,那么在尝试确定解析问题时,请使用例如
Locale.ENGLISH

,始终执行相反的操作,即生成输出,以查看解析输入的外观。这是一种非常适用于所有解析相关问题的技术,无论是解析日期字符串、XML文档、JSON文本等

因此,我们尝试使用给定格式打印日期值,以查看解析时的预期结果:

Locale loc=新的语言环境(“pl”、“pl”);
SimpleDataFormat sdFormat=新的SimpleDataFormat(“d MMMM yyyy”,loc);
sdFormat.setLenient(false);
Calendar cal=Calendar.getInstance(loc);
cal.clear();
cal.set(2020年,日历12月3日);
System.out.println(sdFormat.format(cal.getTime());
在Java7中,我得到了
3 grudzień2020

在Java8、9、11和14中,我得到了
3 grudnia2020


如果您想解析2020年12月3日的

由于您的输入日期字符串是用
English
,因此需要使用
Locale.English
进行解析,并且需要另一个
SimpleDataFormat
实例和
Locale(“pl”、“pl”)
来格式化获得的
java.util.date
对象和
新的Locale(“pl”、“pl”)

演示:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        SimpleDateFormat sdfForParsing = new SimpleDateFormat("d MMMM yyyy", Locale.ENGLISH);
        SimpleDateFormat sdfForFormatting = new SimpleDateFormat("d MMMM yyyy", loc);
        sdfForParsing.setLenient(false);
        try {
            Date d = sdfForParsing.parse(date);
            System.out.println(d);
            String localiseByPolish = sdfForFormatting.format(d);
            System.out.println(localiseByPolish);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Thu Dec 03 00:00:00 GMT 2020
3 grudnia 2020
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH)
                                            .withResolverStyle(ResolverStyle.LENIENT);
        DateTimeFormatter dtfForFormatting = DateTimeFormatter.ofPattern("d MMMM yyyy", loc);
        LocalDate localeDate = LocalDate.parse(date, dtfForParsing);
        System.out.println(localeDate);
        String localiseByPolish = localeDate.format(dtfForFormatting);
        System.out.println(localiseByPolish);
    }
}
2020-12-03
3 grudnia 2020
输出:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        SimpleDateFormat sdfForParsing = new SimpleDateFormat("d MMMM yyyy", Locale.ENGLISH);
        SimpleDateFormat sdfForFormatting = new SimpleDateFormat("d MMMM yyyy", loc);
        sdfForParsing.setLenient(false);
        try {
            Date d = sdfForParsing.parse(date);
            System.out.println(d);
            String localiseByPolish = sdfForFormatting.format(d);
            System.out.println(localiseByPolish);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Thu Dec 03 00:00:00 GMT 2020
3 grudnia 2020
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH)
                                            .withResolverStyle(ResolverStyle.LENIENT);
        DateTimeFormatter dtfForFormatting = DateTimeFormatter.ofPattern("d MMMM yyyy", loc);
        LocalDate localeDate = LocalDate.parse(date, dtfForParsing);
        System.out.println(localeDate);
        String localiseByPolish = localeDate.format(dtfForFormatting);
        System.out.println(localiseByPolish);
    }
}
2020-12-03
3 grudnia 2020
我相信您已经知道,日期时间对象只存储日期时间信息*1,而不存储格式信息。打印时,日期时间对象打印其类的
toString
实现返回的字符串。另外,
java.util.Date
对象并不表示真正的日期时间类,因为它只存储毫秒数(例如,
new Date()
对象是从
1970年1月1日00:00:00 GMT
开始以毫秒数实例化的),当您打印它时,它计算JVM时区中的日期和时间,并打印相同的日期和时间,即如果您在世界任何地方的给定时刻执行以下两行

Date date = new Date();
System.out.println(date.getTime());
你会得到同样的号码。查看演示

java.util
的日期时间API及其格式化API
SimpleDataFormat
已经过时,而且由于此类黑客太多,它们很容易出错。建议完全停止使用,并切换到。有关现代日期时间API的更多信息,请访问

注意:如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并重试

使用现代日期时间API:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        SimpleDateFormat sdfForParsing = new SimpleDateFormat("d MMMM yyyy", Locale.ENGLISH);
        SimpleDateFormat sdfForFormatting = new SimpleDateFormat("d MMMM yyyy", loc);
        sdfForParsing.setLenient(false);
        try {
            Date d = sdfForParsing.parse(date);
            System.out.println(d);
            String localiseByPolish = sdfForFormatting.format(d);
            System.out.println(localiseByPolish);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Thu Dec 03 00:00:00 GMT 2020
3 grudnia 2020
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH)
                                            .withResolverStyle(ResolverStyle.LENIENT);
        DateTimeFormatter dtfForFormatting = DateTimeFormatter.ofPattern("d MMMM yyyy", loc);
        LocalDate localeDate = LocalDate.parse(date, dtfForParsing);
        System.out.println(localeDate);
        String localiseByPolish = localeDate.format(dtfForFormatting);
        System.out.println(localiseByPolish);
    }
}
2020-12-03
3 grudnia 2020
输出:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        SimpleDateFormat sdfForParsing = new SimpleDateFormat("d MMMM yyyy", Locale.ENGLISH);
        SimpleDateFormat sdfForFormatting = new SimpleDateFormat("d MMMM yyyy", loc);
        sdfForParsing.setLenient(false);
        try {
            Date d = sdfForParsing.parse(date);
            System.out.println(d);
            String localiseByPolish = sdfForFormatting.format(d);
            System.out.println(localiseByPolish);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Thu Dec 03 00:00:00 GMT 2020
3 grudnia 2020
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH)
                                            .withResolverStyle(ResolverStyle.LENIENT);
        DateTimeFormatter dtfForFormatting = DateTimeFormatter.ofPattern("d MMMM yyyy", loc);
        LocalDate localeDate = LocalDate.parse(date, dtfForParsing);
        System.out.println(localeDate);
        String localiseByPolish = localeDate.format(dtfForFormatting);
        System.out.println(localiseByPolish);
    }
}
2020-12-03
3 grudnia 2020


*1同时存储时区信息。查看以了解有关这些类的更多信息。

您似乎对解析和格式设置感到困惑

由于您的输入日期字符串是用
English
,因此需要使用
Locale.English
进行解析,并且需要另一个
SimpleDataFormat
实例和
Locale(“pl”、“pl”)
来格式化获得的
java.util.date
对象和
新的Locale(“pl”、“pl”)

演示:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        SimpleDateFormat sdfForParsing = new SimpleDateFormat("d MMMM yyyy", Locale.ENGLISH);
        SimpleDateFormat sdfForFormatting = new SimpleDateFormat("d MMMM yyyy", loc);
        sdfForParsing.setLenient(false);
        try {
            Date d = sdfForParsing.parse(date);
            System.out.println(d);
            String localiseByPolish = sdfForFormatting.format(d);
            System.out.println(localiseByPolish);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Thu Dec 03 00:00:00 GMT 2020
3 grudnia 2020
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH)
                                            .withResolverStyle(ResolverStyle.LENIENT);
        DateTimeFormatter dtfForFormatting = DateTimeFormatter.ofPattern("d MMMM yyyy", loc);
        LocalDate localeDate = LocalDate.parse(date, dtfForParsing);
        System.out.println(localeDate);
        String localiseByPolish = localeDate.format(dtfForFormatting);
        System.out.println(localiseByPolish);
    }
}
2020-12-03
3 grudnia 2020
输出:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        SimpleDateFormat sdfForParsing = new SimpleDateFormat("d MMMM yyyy", Locale.ENGLISH);
        SimpleDateFormat sdfForFormatting = new SimpleDateFormat("d MMMM yyyy", loc);
        sdfForParsing.setLenient(false);
        try {
            Date d = sdfForParsing.parse(date);
            System.out.println(d);
            String localiseByPolish = sdfForFormatting.format(d);
            System.out.println(localiseByPolish);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Thu Dec 03 00:00:00 GMT 2020
3 grudnia 2020
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH)
                                            .withResolverStyle(ResolverStyle.LENIENT);
        DateTimeFormatter dtfForFormatting = DateTimeFormatter.ofPattern("d MMMM yyyy", loc);
        LocalDate localeDate = LocalDate.parse(date, dtfForParsing);
        System.out.println(localeDate);
        String localiseByPolish = localeDate.format(dtfForFormatting);
        System.out.println(localiseByPolish);
    }
}
2020-12-03
3 grudnia 2020
我相信您已经知道,日期时间对象只存储日期时间信息*1,而不存储格式信息。打印时,日期时间对象打印其类的
toString
实现返回的字符串。另外,
java.util.Date
对象并不表示真正的日期时间类,因为它只存储毫秒数(例如,
new Date()
对象是从
1970年1月1日00:00:00 GMT
开始以毫秒数实例化的),当您打印它时,它计算JVM时区中的日期和时间,并打印相同的日期和时间,即如果您在世界任何地方的给定时刻执行以下两行

Date date = new Date();
System.out.println(date.getTime());
你会得到同样的号码。查看演示

java.util
的日期时间API及其格式化API
SimpleDataFormat
已经过时,而且由于此类黑客太多,它们很容易出错。建议完全停止使用,并切换到。有关现代日期时间API的更多信息,请访问

注意:如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并重试

使用现代日期时间API:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        SimpleDateFormat sdfForParsing = new SimpleDateFormat("d MMMM yyyy", Locale.ENGLISH);
        SimpleDateFormat sdfForFormatting = new SimpleDateFormat("d MMMM yyyy", loc);
        sdfForParsing.setLenient(false);
        try {
            Date d = sdfForParsing.parse(date);
            System.out.println(d);
            String localiseByPolish = sdfForFormatting.format(d);
            System.out.println(localiseByPolish);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Thu Dec 03 00:00:00 GMT 2020
3 grudnia 2020
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH)
                                            .withResolverStyle(ResolverStyle.LENIENT);
        DateTimeFormatter dtfForFormatting = DateTimeFormatter.ofPattern("d MMMM yyyy", loc);
        LocalDate localeDate = LocalDate.parse(date, dtfForParsing);
        System.out.println(localeDate);
        String localiseByPolish = localeDate.format(dtfForFormatting);
        System.out.println(localiseByPolish);
    }
}
2020-12-03
3 grudnia 2020
输出:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        SimpleDateFormat sdfForParsing = new SimpleDateFormat("d MMMM yyyy", Locale.ENGLISH);
        SimpleDateFormat sdfForFormatting = new SimpleDateFormat("d MMMM yyyy", loc);
        sdfForParsing.setLenient(false);
        try {
            Date d = sdfForParsing.parse(date);
            System.out.println(d);
            String localiseByPolish = sdfForFormatting.format(d);
            System.out.println(localiseByPolish);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Thu Dec 03 00:00:00 GMT 2020
3 grudnia 2020
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        Locale loc = new Locale("pl", "PL");
        String date = "3 December 2020";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH)
                                            .withResolverStyle(ResolverStyle.LENIENT);
        DateTimeFormatter dtfForFormatting = DateTimeFormatter.ofPattern("d MMMM yyyy", loc);
        LocalDate localeDate = LocalDate.parse(date, dtfForParsing);
        System.out.println(localeDate);
        String localiseByPolish = localeDate.format(dtfForFormatting);
        System.out.println(localiseByPolish);
    }
}
2020-12-03
3 grudnia 2020

*1同时存储时区信息。查看以了解有关th的更多信息