簡體   English   中英

使用CALENDAR將月份和日期數字轉換為一年中的日期

[英]Convert month and day number to day of year using CALENDAR

我有兩個數字。 首先是月份號。 第二個是天數。

我也知道年份。

如何將月份和日期這兩個數字取為單一數字DAY_OF_YEAR?

我正在使用Java 1.7和Calendar函數。

通過ThreeTen Backport的java.time

    int year = 2019;
    int monthNumber = 9;
    int dayNumber = 28;

    LocalDate date = LocalDate.of(year, monthNumber, dayNumber);
    int dayOfYear = date.getDayOfYear();

    System.out.println("Day of year is " + dayOfYear);

該代碼段的輸出為:

一年中的一天是271

使用ThreeTen Backport 1.3.6在Java 1.7.0_79上進行了測試,並導入了org.threeten.bp.LocalDate

考慮避免使用Calendar類

在此,當前接受的用於創建和設置Calendar對象的答案的四行被一行替換。 使用Calendar代碼通常過於冗長,這是我們不希望的。 同樣,盡管Calendar對象的名稱不僅僅是日歷日期,但它還帶有一天中的某個時間,一個時區以及更多內容,因此我認為它不適合手頭的工作。 如果默認語言環境為Thai,則使用Calendar的代碼將給出不同的結果,這將使大多數人感到驚訝。 Calendar類的設計不佳,並且已經過時了。

相反,我使用的是Java.time(現代Java日期和時間API)的LocalDate

問題:我可以在Java 7上使用java.time嗎?

我正在使用Java 1.7…

java.time在Java 7上運行良好。它至少需要Java 6

  • 在Java 8和更高版本以及更新的Android設備(來自API級別26)中,內置了現代API。
  • 在Java 6和7中,獲取ThreeTen Backport,這是現代類的backport(JSR 310的ThreeTen;請參見底部的鏈接)。
  • 在較舊的Android上,請使用Android版本的ThreeTen Backport。 它稱為ThreeTenABP。 並確保使用子包從org.threeten.bp導入日期和時間類。

鏈接

僅使用日歷並假設月份數為零索引,其中0表示一月,這是2019年5月13日的示例:

Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.ENGLISH);
c.set(Calendar.YEAR, 2019);
c.set(Calendar.MONTH, 4);
c.set(Calendar.DAY_OF_MONTH, 13);
System.out.println(c.get(Calendar.DAY_OF_YEAR));

編輯:正如Ole VV的答案指出的那樣,如果您調用“ Calendar.getInstance()”,則將獲得帶有系統時區的Calendar對象,因此我以明確指定要使用的時區和語言環境的方式對其進行了更改。 如果您想獲取某個日期的星期數,而該日期在世界不同地區的規則不同,則后者非常重要。

您可以將零件連接成String ,並使用SimpleDateFormatter例如:

int year = 2019;
int month = 1;
int day = 23;

String string = "" + year + "-" + month + "-" + day;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(string);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));

該示例適用於2019年1月23日。

暫無
暫無

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

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