簡體   English   中英

在靜態上下文中將棄用的 Java 日期替換為 Calendar.set 或 GregorianCalendar.set

[英]Replace deprecated Java Date to Calendar.set ou GregorianCalendar.set in a static context

我正在使用 Java 開發 Android 項目,Android Studio IDE 警告我 Date(int, int, int) 自 API16 起已棄用,但是當我將其替換為 Calendar.set 時,構建失敗,因為無法引用非靜態方法在靜態上下文中。

正在靜態的日期選擇器 onItenSelectedListener 上調用此方法

如果沒有可以真正使用的替代品,它如何被棄用?

java.time 和 ThreeTenABP

使用 java.time 中的LocalDate ,現代 Java 日期和時間 API。 和它一起工作要好得多。

    int year = 2019;
    int month = 10;
    int day = 15;

    LocalDate date = LocalDate.of(year, month, day);
    System.out.println(date);

此代碼段的輸出是:

2019-10-15

LocalDate以與人類相同的方式計算年份和月份,因此無需減去有趣的值進行調整。 如果您需要一個尚未升級到 java.time 的 API 的Date ,則轉換過程如下:

    Instant startOfDay = date.atStartOfDay(ZoneId.systemDefault()).toInstant();
    Date oldfashionedDate = DateTimeUtils.toDate(startOfDay);
    System.out.println(oldfashionedDate);

2019 年 10 月 15 日星期二 00:00:00 CEST

DateCalendarGregorianCalendar都設計得很差,而且都已經過時了。 所以請考慮不使用它們。

問題:java.time 不需要 Android API 級別 26 嗎?

java.time 在較舊和較新的 Android 設備上都能很好地工作。 它只需要至少Java 6

  • 在 Java 8 及更高版本和更新的 Android 設備(從 API 級別 26)中,現代 API 是內置的。 僅在這種情況下,從Instant轉換為Date使用Date.from(startOfDay)
  • 在非 Android Java 6 和 7 中獲得 ThreeTen Backport,現代類的 backport(ThreeTen for JSR 310;請參閱底部的鏈接)。
  • 在(較舊的)Android 上使用 ThreeTen Backport 的 Android 版本。 它被稱為 ThreeTenABP。 並確保使用子包從org.threeten.bp導入日期和時間類。

鏈接

我解決了更換問題

return new Date(year-1900, month, day)

經過

GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
calendar.set(year, month-1, day);
return calendar.getTime();

暫無
暫無

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

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