java—如何使用datetimeformatter从月份(“mmmm”)或年份(“yyyy”)获取日期对象

ef1yzkbh  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(419)

我对使用datetimeformatter包还很陌生,使用simpledateformat也能得到同样的结果。

Date date = new SimpleDateFormat("MMMM").parse(month);//"DECEMBER"
Date date = new SimpleDateFormat("yyyy").parse(year);//"2020"

如何使用datetimeformatter实现这一点?

daolsyd0

daolsyd01#

检查此链接https://www.baeldung.com/java-datetimeformatter. 您可以使用自定义格式作为

String europeanDatePattern = "dd.MM.yyyy";
DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern(europeanDatePattern);
System.out.println(europeanDateFormatter.format(LocalDate.of(2016, 7, 31)))
irtuqstp

irtuqstp2#

api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。让我们看看他们的行动:

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

public class Main {
    public static void main(String[] args) throws ParseException {
        Date date1 = new SimpleDateFormat("MMMM").parse("DECEMBER");
        System.out.println(date1);
        Date date2 = new SimpleDateFormat("yyyy").parse("2020");
        System.out.println(date2);
    }
}

输出:

Tue Dec 01 00:00:00 GMT 1970
Wed Jan 01 00:00:00 GMT 2020

我不需要解释他们的违约情况。它们不应该采用这种意外的默认值,而是应该发出一个警报(抛出一些异常),这将有助于程序员做出React。
由于这些意外情况,建议您完全停止使用它们,转而使用现代的日期时间api。
注意:无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
使用现代日期时间api:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class Main {
    public static void main(String[] args) {
        System.out.println(parse("DECEMBER", "MMMM"));
        System.out.println(parse("2020", "uuuu"));
    }

    static LocalDate parse(String text, String pattern) {
        try {
            return LocalDate.parse(text, DateTimeFormatter.ofPattern(pattern));
        } catch (DateTimeParseException e) {
            System.out.println(e.getMessage());
            // Return some default value
            return LocalDate.MIN;
        }
    }
}

输出:

Text 'DECEMBER' could not be parsed at index 0
-999999999-01-01
Text '2020' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2020},ISO of type java.time.format.Parsed
-999999999-01-01

因此,现在您(程序员)知道您必须做一些事情(例如,使用您自己的默认值)来解析字符串。
演示:

import java.time.LocalDate;
import java.time.Month;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoField;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        LocalDate date = parse("DECEMBER", "MMMM");
        Month month = parse("DECEMBER", "MMMM").getMonth();
        System.out.println(date);
        System.out.println(month);

        date = parse("2020", "uuuu");
        System.out.println(date);
        int year = date.getYear();
        System.out.println(year);
        Year objYear = Year.of(year);
        System.out.println(objYear);
    }

    static LocalDate parse(String text, String pattern) {
        LocalDate today = LocalDate.now();

        // Formatter using today's day, month and year as defaults
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                    .parseCaseInsensitive()
                    .appendPattern(pattern)
                    .parseDefaulting(ChronoField.DAY_OF_MONTH, today.getDayOfMonth())
                    .parseDefaulting(ChronoField.MONTH_OF_YEAR, today.getMonthValue())
                    .parseDefaulting(ChronoField.YEAR, today.getYear())
                    .toFormatter(Locale.ENGLISH);

        try {
            return LocalDate.parse(text, formatter);
        } catch (DateTimeParseException e) {
            System.out.println(e.getMessage());
            // Return some default value
            return LocalDate.MIN;
        }
    }
}

输出:

2020-12-15
DECEMBER
2020-12-15
2020
2020

如果您不想创建日期或日期时间对象,而是只想将字符串解析为 Month 以及 Year ,您可以简单地通过以下方式完成:

import java.time.Month;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.TextStyle;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Month month = new DateTimeFormatterBuilder()
                        .parseCaseInsensitive()
                        .appendPattern("MMMM")
                        .toFormatter(Locale.ENGLISH)
                        .parse("DECEMBER", Month::from);

        System.out.println(month + " | " + month.getDisplayName(TextStyle.SHORT, Locale.ENGLISH) + " | "
                + month.getDisplayName(TextStyle.FULL, Locale.ENGLISH));

        Year year = DateTimeFormatter.ofPattern("uuuu").parse("2020", Year::from);
        System.out.println(year);
    }
}

输出:

DECEMBER | Dec | December
2020

在trail:date-time了解有关现代日期时间api的更多信息。

zz2j4svz

zz2j4svz3#

DateTimeFormatter 不支持 util.Date 同学们,这是你们需要用到的 LocalDate 班级。你不能只用 month 或者 year ,应传递3个值 month , day 以及 year 去约会。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
LocalDate parsedDate = LocalDate.parse("2020 12 15", formatter);
System.out.print(parsedDate); //2020-12-15
wgmfuz8q

wgmfuz8q4#

String monthString = "December";
    DateTimeFormatter monthFormatter
            = DateTimeFormatter.ofPattern("MMMM", Locale.ENGLISH);
    Month month = monthFormatter.parse(monthString, Month::from);
    System.out.println(month);

输出:
十二月
这一年比较简单。我们不需要格式化程序。

String yearString = "2020";
    Year year = Year.parse(yearString);
    System.out.println(year);

2020
老年人 Date 类,尽管它的名字从不代表日期。这是一个时间点。然而,我们通常用它来表示日期、时间、月份、年份以及更多的用途,有时也用于表示时间点。一个非常令人困惑的结果是 Date 从你的问题代码中获得的对象在极少数情况下会错误地打印为11月而不是12月,打印为2019年而不是2020年。你不应该再使用 Date 班级。它的设计总是很差,而且早已过时。
另一方面,java.time是现代的java日期和时间api DateTimeFormatter 属于,为每个此类概念定义一个类: LocalDate 为了约会, Month 一年中的一个月, Year 一年等等,它让我们的代码更清楚地知道我们在处理什么,这是好的。它还要求我们了解不同的课程,并考虑每次使用哪一个。
如果您的月份字符串都是大写的,我们需要告诉格式化程序进行解析,而不考虑大小写:

String monthString = "DECEMBER";
    DateTimeFormatter monthFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("MMMM")
            .toFormatter(Locale.ENGLISH);
    Month month = monthFormatter.parse(monthString, Month::from);

当你的月名是英语时,记得指定一个说英语的地区。

相关问题