无法在java的波兰语区域设置中分析格式为d mmmm yyy的日期

mlmc2os5  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(527)

我试图用波兰语言环境中的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();
    }
vm0i2vca

vm0i2vca1#

你好像把解析和格式化搞混了。
因为你的输入日期字符串 English ,您需要使用 Locale.ENGLISH 你需要另一个 SimpleDateFormatLocale("pl", "PL") 格式化获取的 java.util.Date 对象 new 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

我相信您已经知道日期时间对象只存储日期时间信息*1而不存储格式信息。打印时,日期时间对象打印 toString 类的实现。还有,一个 java.util.Date 对象不表示真正的日期时间类,因为它只存储毫秒(例如。 new Date() 对象示例化的毫秒数 January 1, 1970, 00:00:00 GMT )当您打印它时,它会计算jvm时区中的日期时间,并打印相同的日期时间,也就是说,如果您在世界上任何地方的给定时刻执行以下两行,

Date date = new Date();
System.out.println(date.getTime());

你会得到相同的号码。请检查此答案以获取演示。
api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 它们已经过时了,而且由于有这么多这样的黑客,它们很容易出错。建议完全停止使用它们,并切换到现代日期时间api。在trail:date-time了解有关现代日期时间api的更多信息。
注意:如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
使用现代日期时间api:

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现代日期时间api还存储时区信息。查看概述以了解有关这些类的更多信息。
uqdfh47h

uqdfh47h2#

当试图确定解析的问题时,总是做相反的操作,即生成输出,以查看解析的输入应该是什么样子。这是一种非常适用于所有解析相关问题的技术,无论是解析日期字符串、xml文档、json文本等。
因此,我们尝试使用给定格式打印日期值,以查看解析时的预期结果:

Locale loc = new Locale("pl", "PL");
SimpleDateFormat sdFormat = new SimpleDateFormat("d MMMM yyyy", loc);
sdFormat.setLenient(false);

Calendar cal = Calendar.getInstance(loc);
cal.clear();
cal.set(2020, Calendar.DECEMBER, 3);
System.out.println(sdFormat.format(cal.getTime()));

在Java7中,我得到 3 grudzień 2020 .
在Java8、9、11和14中,我得到 3 grudnia 2020 .
如果你想解析 3 December 2020 ,然后使用例如。 Locale.ENGLISH .

相关问题