DAY,MONTH,YEAR中的日期对象

问题描述

我正在尝试创建一种将Java中的DAY,MONTH,YEAR转换为Date对象的方法

我有

String DAY = "31"
String YEAR = "2012"
String MONTH = "11"

我需要一种可配置的格式作为输出。

String format = "MM/dd/yyy";

我将始终仅将DAY字符串从“ 01”更改为“ 31”
我将始终只将YEAR字符串从“ 1000”更改为“ 9999”
我将始终只将MONTH字符串从“ 01”更改为“ 12”(从不获取Jan,Feb等)

我了解SimpleDateFormat(format)可以在某种程度上发挥作用。

新的SimpleDateFormat(“ MM / dd / yyyy”)会将“ 02/01/2010”解析为2010年2月1日,但
新的SimpleDateFormat(“ mm / dd / yyyy”)会将“ 02/01/2010”解析为2010年1月1日

是否可以在Java中编写一个通用方法,该方法基于可配置的模式将给定的字符串(DAY,MONTH,YEAR)转换为Date对象?可能抛出异常的原因是我提供了DAY,MONTH,YEAR的错误组合(例如DAY =“ 31”,MONTH =“ 02”,YEAR =“ 2010”)

类似的东西:

Date dateParser(String format){
  
  String DAY = "01";
  String YEAR = "1922";
  String MONTH = "02";
  
  
  return date;
}

解决方法

基本上有两种方法:

  1. 将每个字符串解析为一个数字,然后将数字加在一起作为一个日期。
  2. 将字符串组合成一个字符串,并将其解析为一个日期。

一些中间形式是可以考虑的,但是我建议您采取纯粹的立场,并仅使用其中一种方式。 Arvind Kumar Avinash的答案显示了选项1。我的口味更像是选项2,所以让我演示一下。

我建议您将java.time(现代Java日期和时间API)用于日期工作。

vm.$options.created.forEach(hook => {
  hook.call(vm);
});

由于11月(第11个月)只有30天,因此该代码非常明智地引发了异常:

线程“ main”中的异常java.time.format.DateTimeParseException: 无法解析文字“ 2012-11-31”:无效的日期“ NOVEMBER 31”

也就是说,我们有免费的输入验证。对于有效日期,代码将按要求解析日期和格式。

链接

Oracle tutorial: Date Time解释了如何使用java.time。

,

我建议您从过时且容易出错的java.util日期时间API和SimpleDateFormat切换到modern java.time日期时间API和相应的格式化API (软件包java.time.format)。从 Trail: Date Time 了解有关现代日期时间API的更多信息。

请注意,mm用于minute;不适用于month。对于month,请使用MM。检查this了解更多信息。

使用现代的日期时间API:

import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(getLocalDate("2010","02","28"));
        System.out.println(getLocalDate("2010","31"));
    }

    static LocalDate getLocalDate(String year,String month,String dayOfMonth) {
        return LocalDate.of(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(dayOfMonth));
    }
}

输出:

2010-02-28
Exception in thread "main" java.time.DateTimeException: Invalid date 'FEBRUARY 31'
    at java.base/java.time.LocalDate.create(LocalDate.java:459)
    at java.base/java.time.LocalDate.of(LocalDate.java:271)
    at Main.getLocalDate(Main.java:11)
    at Main.main(Main.java:7)

请注意,日期时间对象应该存储有关日期,时间,时区等的信息,但不存储格式信息。当您打印日期时间类型的对象时,该对象应打印其toString方法返回的内容。如果您需要以其他格式打印日期时间,则需要一个格式设置类(例如DateTimeFormatter),该类可以按您想要的模式返回字符串,例如

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

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(getFormattedLocalDate("2010/02/28","yyyy/MM/dd","EEEE dd MMMM yyyy"));
        System.out.println(getFormattedLocalDate("28/02/2010","dd/MM/yyyy","yyyy MMM EEE dd"));
    }

    static String getFormattedLocalDate(String date,String inputPattern,String outputPattern) {
        return LocalDate.parse(date,DateTimeFormatter.ofPattern(inputPattern))
                .format(DateTimeFormatter.ofPattern(outputPattern));
    }
}

输出:

Sunday 28 February 2010
2010 Feb Sun 28

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...