簡體   English   中英

如何在Java中從月份和年份生成日期?

[英]How to generate a Date from just Month and Year in Java?

我需要為信用卡到期日生成一個新的Date對象,我只有一個月和一年,我怎樣才能根據這兩個生成一個Date? 我需要最簡單的方法。 我在這里閱讀其他一些答案,但它們看起來都太復雜了。

你可以使用java.util.Calendar

Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.YEAR, year);
Date date = calendar.getTime();

java.time

使用Java 8中內置的java.time框架

import java.time.YearMonth;

int year = 2015;
int month = 12;
YearMonth.of(year,month); // 2015-12

來自String

YearMonth.parse("2015-12"); // 2015-12

使用自定義DateTimeFormatter

import java.time.format.DateTimeFormatter;

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM yyyy");
YearMonth.parse("12 2015", formatter); // 2015-12

轉換YearMonth 轉換為更標准的日期表示形式,即LocalDate

LocalDate startMonth = date.atDay(1); //2015-12-01
LocalDate endMonth = date.atEndOfMonth(); //2015-12-31

因為你要求java.util.Date ,可能是一個非答案,但它似乎是一個很好的機會,指出Java中的日期和時間以及日歷的大多數工作可能應該使用Joda-Time庫來完成,其中案件

new LocalDate(year, month, 1)

浮現在腦海中。

Joda-Time在這個月的日子里有很多其他的好東西。 例如,如果您想知道當月的第一天,您可以寫信

LocalDate firstOfThisMonth = new LocalDate().withDayOfMonth(1);

在您的注釋中,您詢問是否將字符串傳遞給java.util.Date構造函數,例如:

new Date("2012-09-19")

不推薦使用此版本的構造函數,因此請勿使用它。 您應該創建日期格式化程序並調用parse 這是一個很好的建議,因為你可能會將yearmonth作為整數值,並且需要制作一個好的字符串,正確填充和分隔以及所有這些,這在所有情況下都難以置信。 出於這個原因,使用日期格式化程序,它知道如何完美地處理所有這些東西。

其他早期的答案顯示了如何做到這一點。

喜歡

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM");
Date utilDate = formatter.parse(year + "/" + month);

復制來自年,月,日形式或類似的創建java.util.Date對象

DateTime aDate = new DateTime(year, month, 1, 0, 0, 0);

什么是用Java創建日期的正確方法復制

最常見的方法是使用Date(“YYYY-MM-DD”)構造函數,即使它已被棄用。 這是即時創建日期的最簡單方法。 任何人決定棄用它。 萬歲(“YYYY-MM-DD”)!!!

不要使用這個答案。 使用PrzemekRay Toel的答案。 正如Przemek所說,更喜歡使用YearMonth代表年月。 如前所述,如果您必須使用日期,請使用LocalDate ,這是一個沒有時間的日期。

如果你絕對不可缺少地需要一個老式的java.util.Date對象用於你無法改變的遺留API,這里有一個簡單的方法。 它可能無法正常工作,它可能無法准確提供您所需的日期,這取決於您的確切要求。

    YearMonth expiration = YearMonth.of(2021, 8); // or .of(2021, Month.AUGUST);
    Date oldFashionedDateObject = Date.from(expiration
            .atDay(1)
            .atStartOfDay(ZoneId.systemDefault())
            .toInstant());
    System.out.println(oldFashionedDateObject);

在我的電腦上打印

Sun Aug 01 00:00:00 CEST 2021

我們得到的是當地時區午夜的第一個月 - 更准確地說,是我的JVM的時區設置。 這是對遺留API預期的一個很好的猜測,但它也很危險。 JVM的時區設置可能由程序的其他部分或在同一JVM中運行的其他程序在我們的腳下更改。 換句話說,我們無法確定我們得到了什么。

如果將日期傳輸到運行不同時區的計算機(例如從客戶端到服務器或反之,或者運行到自己的時區的數據庫),則時區問題會變得更糟。 您的Date將在上個月出現約50%的風險。

如果你知道最后所需的時區,將有助於指定例如ZoneId.of("America/New_York")而不是上面代碼段中的系統默認值。

如果你的API很寬松而且在正確的月份內只需要一些點,你最好在它自己的時區中給它當月的第二個月或第三個月。 以下是如何做前者:

    Date oldFashionedDateObject = Date.from(expiration
            .atDay(2)
            .atStartOfDay(ZoneOffset.UTC)
            .toInstant());

暫無
暫無

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

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