簡體   English   中英

來自 DAY、MONTH、YEAR 的日期對象

[英]Date object from DAY, MONTH, YEAR

我正在嘗試創建一個在 Java 中將 DAY、MONTH、YEAR 轉換為 Date 對象的方法

我有

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

我需要一個可配置的格式作為輸出。

String format = "MM/dd/yyy";

我將始終只獲得從“01”到“31”的 DAY 字符串
我將始終只獲得從“1000”到“9999”的 YEAR 字符串
我將始終只獲得從“01”到“12”的 MONTH 字符串(永遠不會得到 Jan、Feb 等)

我知道 SimpleDateFormat(format) 可以在一定程度上工作。

new SimpleDateFormat("MM/dd/yyyy") 會將 "02/01/2010" 解析為 2010 年 2 月 1 日,但
new SimpleDateFormat("mm/dd/yyyy") 將解析 "02/01/2010" 為 Jan 01 2010

是否可以在 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 用於您的日期工作。

    String format = "MM/dd/yyy";
    
    String day = "31";
    String year = "2012";
    String month = "11";
    
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(format, Locale.US);
    
    String isoDateString = year + '-' + month + '-' + day;
    LocalDate date = LocalDate.parse(isoDateString);
    
    String formattedDate = date.format(dateFormatter);
    System.out.println(formattedDate);

由於 11 月(11 月)只有 30 天,這段代碼非常明智地拋出了一個異常:

線程“main”中的異常 java.time.format.DateTimeParseException:無法解析文本“2012-11-31”:無效日期“NOVEMBER 31”

也就是說,我們有免費的輸入驗證。 對於有效日期,代碼將根據要求解析日期和格式。

關聯

Oracle 教程:解釋如何使用 java.time 的日期時間

我建議您從過時且容易出錯的java.util date-time API 和SimpleDateFormat切換到現代java.time date-time API 和相應的格式化 API(包, java.time.format )。 Trail: Date Time 中了解有關現代日期時間 API 的更多信息。

請注意, mm用於表示minute 不是month 對於month ,你用MM 檢查這個以獲取更多信息。

使用現代日期時間 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", "02", "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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM